Skip to content

Commit cc08cb7

Browse files
committed
fix(ts): improve Draft<T> with generics
And other small improvements. Fixes #272
1 parent 8666d32 commit cc08cb7

File tree

1 file changed

+14
-24
lines changed

1 file changed

+14
-24
lines changed

src/immer.d.ts

Lines changed: 14 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -12,37 +12,27 @@ type AtomicObject =
1212
| Number
1313
| String
1414

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>
2717

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>]
3220
>
3321

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
3624
}
3725

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
4228
: 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
4434
: T extends object
45-
? DraftObject<T>
35+
? {-readonly [P in keyof T]: Draft<T[P]>}
4636
: T
4737

4838
export interface Patch {

0 commit comments

Comments
 (0)