/** * See the definition of `@types/lodash`. */ type GetIndexedField = K extends keyof T ? T[K] : K extends `${number}` ? 'length' extends keyof T ? number extends T['length'] ? number extends keyof T ? T[number] : undefined : undefined : undefined : undefined; type FieldWithPossiblyUndefined = Get, Key> | Extract; type IndexedFieldWithPossiblyUndefined = GetIndexedField, Key> | Extract; type Get = P extends `${infer Left}.${infer Right}` ? Left extends keyof Exclude ? FieldWithPossiblyUndefined[Left], Right> | Extract : Left extends `${infer FieldKey}[${infer IndexKey}]` ? FieldKey extends keyof T ? FieldWithPossiblyUndefined, Right> : undefined : undefined : P extends keyof T ? T[P] : P extends `${infer FieldKey}[${infer IndexKey}]` ? FieldKey extends keyof T ? IndexedFieldWithPossiblyUndefined : undefined : IndexedFieldWithPossiblyUndefined; export type { Get };