type NonNullObject = {} & object; function getDeepKeys(obj: NonNullObject) { let keys: string[] = []; for (const key in obj) { if (typeof obj[key] === 'object') { const subKeys = getDeepKeys(obj[key]); keys = keys.concat(subKeys.map((subKey) => `${key}.${subKey}`)); } else { keys.push(key); } } return keys; }