递归映射类型中的数组值

时间:2018-06-09 02:28:24

标签: typescript

我有一个映射的Draft类型:

export type Draft<T> = {
  -readonly [P in keyof T]: Draft<T[P]>;
};

当我使用它来包装数组时,我不再能够调用实例方法:

const arr: Draft<Array<number>> = [];
arr.push(42); // Cannot invoke an expression whose type lacks a call signature. Type 'Draft<(...items: number[]) => number>' has no compatible call signatures.

有没有办法制作我的Draft类型的复制呼叫签名?如果我将-readonly [P in keyof T]: Draft<T[P]>更改为-readonly [P in keyof T]: T[P],我可以调用方法,但Draft不会递归应用。

1 个答案:

答案 0 :(得分:0)

我想出了一个基于DeepReadOnly<T>的官方实施的解决方案:

export type DraftObject<T> = {
  -readonly [P in keyof T]: Draft<T[P]>;
};
interface DraftArray<T> extends Array<Draft<T>> { }
export type Draft<T> =
  T extends any[] ? DraftArray<T[number]> :
  T extends ReadonlyArray<any> ? DraftArray<T[number]> :
  T extends object ? DraftObject<T> :
  T;