@@ -49,16 +49,23 @@ type Prev = [never, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, ...0[]];
4949 * type P1 = AllPaths<FormValues>;
5050 * // => "age" | "code" | "phone"|"info" | "info.age" | "info.city" | "info.name" | "info.pl" | "info.pl.age" | `info2.${number}.age` | `info2.${number}.city` | `info2.${number}.name`
5151 */
52- export type AllPaths < T , Index extends number = number , P extends string = '' , Depth extends number = 6 > =
53- [ Depth ] extends [ never ] ? never :
54- T extends Primitive ? ( P extends '' ? never : P ) :
55- T extends readonly ( infer U ) [ ]
56- ? ( P extends '' ? never : P ) | AllPaths < U , Index , Join < P , `${Index } `> , Prev [ Depth ] >
57- : T extends object
58- ? ( P extends '' ? never : P ) | {
59- [ K in Extract < keyof T , string > ] : AllPaths < T [ K ] , Index , Join < P , K > , Prev [ Depth ] >
60- } [ Extract < keyof T , string > ]
61- : never ;
52+ export type AllPaths < T , Index extends number = number , P extends string = '' , Depth extends number = 6 > = [
53+ Depth
54+ ] extends [ never ]
55+ ? never
56+ : T extends Primitive
57+ ? P extends ''
58+ ? never
59+ : P
60+ : T extends readonly ( infer U ) [ ]
61+ ? ( P extends '' ? never : P ) | AllPaths < U , Index , Join < P , `${Index } `> , Prev [ Depth ] >
62+ : T extends object
63+ ?
64+ | ( P extends '' ? never : P )
65+ | {
66+ [ K in Extract < keyof T , string > ] : AllPaths < T [ K ] , Index , Join < P , K > , Prev [ Depth ] > ;
67+ } [ Extract < keyof T , string > ]
68+ : never ;
6269
6370type OptionalIfObject < T > = T extends object ? ( T extends readonly any [ ] ? T : { [ K in keyof T ] ?: T [ K ] } ) : T ;
6471
@@ -140,9 +147,8 @@ type BuildShape<T, P extends string> = P extends `${infer K}.${infer R}`
140147 : never
141148 : P extends `${infer K } `
142149 ? K extends keyof T
143- ? T [ K ] extends readonly ( infer U ) [ ] // ← 命中数组本身
144- ? // 元素若是对象 => 深可选对象数组;若是原始类型 => 原样元素数组
145- Wrap < Extract < K , string > , Array < U extends object ? DeepOptional < U > : U > >
150+ ? T [ K ] extends readonly ( infer U ) [ ]
151+ ? Wrap < Extract < K , string > , Array < U extends object ? DeepOptional < U > : U > >
146152 : T [ K ] extends object
147153 ? Wrap < Extract < K , string > , DeepOptional < T [ K ] > >
148154 : Wrap < Extract < K , string > , T [ K ] >
@@ -167,20 +173,25 @@ export type ShapeFromPaths<T, Ps extends readonly string[]> = Ps extends []
167173 ? T
168174 : MergeUnion < Ps [ number ] extends infer P ? ( P extends string ? BuildShape < T , P > : never ) : never > ;
169175
170- type PathsShape < T , Index extends number = number , P extends string = '' , Depth extends number = 6 > =
171- [ Depth ] extends [ never ] ? never :
172- T extends Primitive
173- ? ( P extends '' ? { } : { [ K in P ] : true } )
176+ type PathsShape < T , Index extends number = number , P extends string = '' , Depth extends number = 6 > = [ Depth ] extends [
177+ never
178+ ]
179+ ? never
180+ : T extends Primitive
181+ ? P extends ''
182+ ? { }
183+ : { [ K in P ] : true }
174184 : T extends readonly ( infer U ) [ ]
175- ? ( P extends '' ? { } : { [ K in P ] : true } ) &
176- PathsShape < U , Index , Join < P , `${Index } `> , Prev [ Depth ] >
185+ ? ( P extends '' ? { } : { [ K in P ] : true } ) & PathsShape < U , Index , Join < P , `${Index } `> , Prev [ Depth ] >
177186 : T extends object
178187 ? ( P extends '' ? { } : { [ K in P ] : true } ) &
179- MergeUnion < { [ K in Extract < keyof T , string > ] : PathsShape < T [ K ] , Index , Join < P , K > , Prev [ Depth ] > } [ Extract < keyof T , string > ] >
188+ MergeUnion <
189+ { [ K in Extract < keyof T , string > ] : PathsShape < T [ K ] , Index , Join < P , K > , Prev [ Depth ] > } [ Extract <
190+ keyof T ,
191+ string
192+ > ]
193+ >
180194 : { } ;
181195
182-
183196export type AllPathsShape < T > = MergeUnion < PathsShape < T > > ;
184197export type AllPathsKeys < T > = keyof AllPathsShape < T > & string ;
185-
186-
0 commit comments