Skip to content

Commit 31599de

Browse files
authored
feat: DeepNamePath deep = 5 (#700)
1 parent 6fac7ed commit 31599de

File tree

1 file changed

+22
-22
lines changed

1 file changed

+22
-22
lines changed

src/namePathType.ts

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -6,27 +6,27 @@ type BaseNamePath = string | number | boolean | (string | number | boolean)[];
66
export type DeepNamePath<
77
Store = any,
88
ParentNamePath extends any[] = [],
9-
> = ParentNamePath['length'] extends 10
9+
> = ParentNamePath['length'] extends 5
1010
? never
1111
: // Follow code is batch check if `Store` is base type
12-
true extends (Store extends BaseNamePath ? true : false)
13-
? ParentNamePath['length'] extends 0
14-
? Store | BaseNamePath // Return `BaseNamePath` instead of array if `ParentNamePath` is empty
15-
: Store extends any[]
16-
? [...ParentNamePath, number] // Connect path
17-
: never
18-
: Store extends any[] // Check if `Store` is `any[]`
19-
? // Connect path. e.g. { a: { b: string }[] }
20-
// Get: [a] | [ a,number] | [ a ,number , b]
21-
[...ParentNamePath, number] | DeepNamePath<Store[number], [...ParentNamePath, number]>
22-
: keyof Store extends never // unknown
23-
? Store
24-
: {
25-
// Convert `Store` to <key, value>. We mark key a `FieldKey`
26-
[FieldKey in keyof Store]: Store[FieldKey] extends Function
27-
? never
28-
:
29-
| (ParentNamePath['length'] extends 0 ? FieldKey : never) // If `ParentNamePath` is empty, it can use `FieldKey` without array path
30-
| [...ParentNamePath, FieldKey] // Exist `ParentNamePath`, connect it
31-
| DeepNamePath<Required<Store>[FieldKey], [...ParentNamePath, FieldKey]>; // If `Store[FieldKey]` is object
32-
}[keyof Store];
12+
true extends (Store extends BaseNamePath ? true : false)
13+
? ParentNamePath['length'] extends 0
14+
? Store | BaseNamePath // Return `BaseNamePath` instead of array if `ParentNamePath` is empty
15+
: Store extends any[]
16+
? [...ParentNamePath, number] // Connect path
17+
: never
18+
: Store extends any[] // Check if `Store` is `any[]`
19+
? // Connect path. e.g. { a: { b: string }[] }
20+
// Get: [a] | [ a,number] | [ a ,number , b]
21+
[...ParentNamePath, number] | DeepNamePath<Store[number], [...ParentNamePath, number]>
22+
: keyof Store extends never // unknown
23+
? Store
24+
: {
25+
// Convert `Store` to <key, value>. We mark key a `FieldKey`
26+
[FieldKey in keyof Store]: Store[FieldKey] extends Function
27+
? never
28+
:
29+
| (ParentNamePath['length'] extends 0 ? FieldKey : never) // If `ParentNamePath` is empty, it can use `FieldKey` without array path
30+
| [...ParentNamePath, FieldKey] // Exist `ParentNamePath`, connect it
31+
| DeepNamePath<Required<Store>[FieldKey], [...ParentNamePath, FieldKey]>; // If `Store[FieldKey]` is object
32+
}[keyof Store];

0 commit comments

Comments
 (0)