|
1 | 1 | // https://dev.to/tipsy_dev/advanced-typescript-reinventing-lodash-get-4fhe |
2 | | -type GetIndexedField<T, K> = K extends keyof T |
3 | | - ? T[K] |
| 2 | +type GetIndexedField<T, K> = K extends keyof NonNullable<T> |
| 3 | + ? NonNullable<T>[K] |
4 | 4 | : K extends `${number}` |
5 | | - ? '0' extends keyof T |
| 5 | + ? '0' extends keyof NonNullable<T> |
6 | 6 | ? undefined |
7 | | - : number extends keyof T |
8 | | - ? T[number] |
| 7 | + : number extends keyof NonNullable<T> |
| 8 | + ? NonNullable<T>[number] |
9 | 9 | : undefined |
10 | 10 | : undefined; |
11 | 11 | type FieldWithPossiblyUndefined<T, Key> = |
12 | | - | GetFieldType<Exclude<T, undefined>, Key> |
13 | | - | Extract<T, undefined>; |
| 12 | + | GetFieldType<Exclude<NonNullable<T>, undefined>, Key> |
| 13 | + | Extract<NonNullable<T>, undefined>; |
14 | 14 | type IndexedFieldWithPossiblyUndefined<T, Key> = |
15 | | - | GetIndexedField<Exclude<T, undefined>, Key> |
16 | | - | Extract<T, undefined>; |
| 15 | + | GetIndexedField<Exclude<NonNullable<T>, undefined>, Key> |
| 16 | + | Extract<NonNullable<T>, undefined>; |
17 | 17 | export type GetFieldType<T, P> = P extends `${infer Left}.${infer Right}` |
18 | | - ? Left extends keyof T |
19 | | - ? FieldWithPossiblyUndefined<T[Left], Right> |
| 18 | + ? Left extends keyof NonNullable<T> |
| 19 | + ? FieldWithPossiblyUndefined<NonNullable<T>[Left], Right> |
20 | 20 | : Left extends `${infer FieldKey}[${infer IndexKey}]` |
21 | | - ? FieldKey extends keyof T |
| 21 | + ? FieldKey extends keyof NonNullable<T> |
22 | 22 | ? FieldWithPossiblyUndefined< |
23 | | - IndexedFieldWithPossiblyUndefined<T[FieldKey], IndexKey>, |
| 23 | + IndexedFieldWithPossiblyUndefined<NonNullable<T>[FieldKey], IndexKey>, |
24 | 24 | Right |
25 | 25 | > |
26 | 26 | : undefined |
27 | 27 | : undefined |
28 | 28 | : P extends keyof T |
29 | | - ? T[P] |
| 29 | + ? NonNullable<T>[P] |
30 | 30 | : P extends `${infer FieldKey}[${infer IndexKey}]` |
31 | | - ? FieldKey extends keyof T |
32 | | - ? IndexedFieldWithPossiblyUndefined<T[FieldKey], IndexKey> |
| 31 | + ? FieldKey extends keyof NonNullable<T> |
| 32 | + ? IndexedFieldWithPossiblyUndefined<NonNullable<T>[FieldKey], IndexKey> |
33 | 33 | : undefined |
34 | 34 | : undefined; |
35 | 35 |
|
36 | 36 | // https://stackoverflow.com/questions/58434389/typescript-deep-keyof-of-a-nested-object |
37 | 37 |
|
38 | 38 | export type DotPrefix<T extends string> = T extends '' ? '' : `.${T}`; |
39 | | -// export type DotNestedKeysAndRoot<T> = ( |
40 | | -// T extends object |
41 | | -// ? { |
42 | | -// [K in Exclude<keyof T, symbol>]: `${K}${DotPrefix< |
43 | | -// DotNestedKeys<T[K]> |
44 | | -// >}`; |
45 | | -// }[Exclude<keyof T, symbol>] |
46 | | -// : '' |
47 | | -// ) extends infer D |
48 | | -// ? Extract<D, string> |
49 | | -// : never; |
50 | | - |
51 | 39 | export type DotNestedKeysWithRoot<T> = ( |
52 | 40 | T extends object |
53 | 41 | ? { |
54 | 42 | [K in Exclude<keyof T, symbol>]: |
55 | | - | `${K}${DotPrefix<DotNestedKeys<T[K]>>}` |
| 43 | + | `${K}${DotPrefix<DotNestedKeysWithRoot<T[K]>>}` |
56 | 44 | | `${K}`; |
57 | 45 | }[Exclude<keyof T, symbol>] |
58 | 46 | : '' |
59 | 47 | ) extends infer D |
60 | 48 | ? Extract<D, string> |
61 | 49 | : never; |
62 | | - |
63 | 50 | export type DotNestedKeys<T> = ( |
64 | 51 | T extends object |
65 | 52 | ? { |
|
0 commit comments