我有一个映射的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
不会递归应用。
答案 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;