Skip to content

Commit b2cc8c2

Browse files
committed
fix: support tuples with spread in WritableDraft
1 parent d422304 commit b2cc8c2

File tree

2 files changed

+20
-1
lines changed

2 files changed

+20
-1
lines changed

__tests__/produce.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -770,3 +770,9 @@ it("allows higher order type inference", () => {
770770
)
771771
}
772772
})
773+
774+
it("supports tuples with spread", () => {
775+
type State = [boolean, ...number[]]
776+
const foo = (x: State) => x
777+
produce<State>(x => foo(x))
778+
})

src/types/types-external.ts

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,23 @@ type WeakReferences = IfAvailable<WeakMap<any, any>> | IfAvailable<WeakSet<any>>
3232

3333
export type WritableDraft<T> = T extends any[]
3434
? number extends T["length"]
35-
? Draft<T[number]>[]
35+
? IsPlainArray<T> extends true
36+
? Draft<T[number]>[]
37+
: WritableNonArrayDraft<T>
3638
: WritableNonArrayDraft<T>
3739
: WritableNonArrayDraft<T>
3840

41+
/**
42+
* Distinguishes plain array types (`number[]`, `readonly string[]`, etc.) from
43+
* tuple types — including variadic tuples like `[boolean, ...number[]]` — whose
44+
* `length` is also `number` but must not be widened to `Element[]`.
45+
*/
46+
type IsPlainArray<T extends readonly any[]> = T extends readonly (infer U)[]
47+
? U[] extends T
48+
? true
49+
: false
50+
: false
51+
3952
type WritableNonArrayDraft<T> = {
4053
-readonly [K in keyof T]: {_: T[K]} extends {_: infer V}
4154
? V extends object

0 commit comments

Comments
 (0)