From cc08cb7e9c2fd4974148a027ff1d1c86581092ac Mon Sep 17 00:00:00 2001 From: aleclarson Date: Sun, 16 Dec 2018 13:10:39 -0500 Subject: [PATCH] fix(ts): improve Draft with generics And other small improvements. Fixes #272 --- src/immer.d.ts | 38 ++++++++++++++------------------------ 1 file changed, 14 insertions(+), 24 deletions(-) diff --git a/src/immer.d.ts b/src/immer.d.ts index 68a185bc..d7ff8107 100644 --- a/src/immer.d.ts +++ b/src/immer.d.ts @@ -12,37 +12,27 @@ type AtomicObject = | Number | String -/** Use type inference to know when an array is finite */ -type IsFinite = T extends never[] - ? true - : T extends ReadonlyArray - ? (U[] extends T ? false : true) - : true - -export type DraftObject = T extends object - ? T extends AtomicObject - ? T - : {-readonly [P in keyof T]: Draft} - : T +type ArrayMethod = Exclude +type Indices = Exclude -export type DraftArray = Array< - T extends ReadonlyArray - ? {[P in keyof T]: Draft}[keyof T] - : DraftObject +export type DraftArray> = Array< + {[P in Indices]: Draft}[Indices] > -export type DraftTuple = { - [P in keyof T]: T[P] extends T[number] ? Draft : never +export type DraftTuple> = { + [P in keyof T]: P extends Indices ? Draft : never } -export type Draft = T extends any[] - ? IsFinite extends true - ? DraftTuple - : DraftArray +export type Draft = T extends never[] + ? T : T extends ReadonlyArray - ? DraftArray + ? T[number][] extends T + ? DraftArray + : DraftTuple + : T extends AtomicObject + ? T : T extends object - ? DraftObject + ? {-readonly [P in keyof T]: Draft} : T export interface Patch {