@@ -12,37 +12,27 @@ type AtomicObject =
12
12
| Number
13
13
| String
14
14
15
- /** Use type inference to know when an array is finite */
16
- type IsFinite < T extends any [ ] > = T extends never [ ]
17
- ? true
18
- : T extends ReadonlyArray < infer U >
19
- ? ( U [ ] extends T ? false : true )
20
- : true
21
-
22
- export type DraftObject < T > = T extends object
23
- ? T extends AtomicObject
24
- ? T
25
- : { - readonly [ P in keyof T ] : Draft < T [ P ] > }
26
- : T
15
+ type ArrayMethod = Exclude < keyof [ ] , number >
16
+ type Indices < T > = Exclude < keyof T , ArrayMethod >
27
17
28
- export type DraftArray < T > = Array <
29
- T extends ReadonlyArray < any >
30
- ? { [ P in keyof T ] : Draft < T > } [ keyof T ]
31
- : DraftObject < T >
18
+ export type DraftArray < T extends ReadonlyArray < any > > = Array <
19
+ { [ P in Indices < T > ] : Draft < T [ P ] > } [ Indices < T > ]
32
20
>
33
21
34
- export type DraftTuple < T extends any [ ] > = {
35
- [ P in keyof T ] : T [ P ] extends T [ number ] ? Draft < T [ P ] > : never
22
+ export type DraftTuple < T extends ReadonlyArray < any > > = {
23
+ [ P in keyof T ] : P extends Indices < T > ? Draft < T [ P ] > : never
36
24
}
37
25
38
- export type Draft < T > = T extends any [ ]
39
- ? IsFinite < T > extends true
40
- ? DraftTuple < T >
41
- : DraftArray < T [ number ] >
26
+ export type Draft < T > = T extends never [ ]
27
+ ? T
42
28
: T extends ReadonlyArray < any >
43
- ? DraftArray < T [ number ] >
29
+ ? T [ number ] [ ] extends T
30
+ ? DraftArray < T >
31
+ : DraftTuple < T >
32
+ : T extends AtomicObject
33
+ ? T
44
34
: T extends object
45
- ? DraftObject < T >
35
+ ? { - readonly [ P in keyof T ] : Draft < T [ P ] > }
46
36
: T
47
37
48
38
export interface Patch {
0 commit comments