Typescript 递归映射类型中的数组值
我有一个映射的Typescript 递归映射类型中的数组值,typescript,Typescript,我有一个映射的草稿类型: export type Draft<T> = { -readonly [P in keyof T]: Draft<T[P]>; }; 导出类型草稿={ -只读[P in keyof T]:草稿; }; 当我使用它包装数组时,我不再能够调用实例方法: const arr: Draft<Array<number>> = []; arr.push(42); // Cannot invoke an expression w
草稿
类型:
export type Draft<T> = {
-readonly [P in keyof T]: Draft<T[P]>;
};
导出类型草稿={
-只读[P in keyof T]:草稿;
};
当我使用它包装数组时,我不再能够调用实例方法:
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.
const-arr:Draft=[];
arr.push(42);//无法调用其类型缺少调用签名的表达式。类型“Draft number>”没有兼容的呼叫签名。
有没有办法让我的
草稿
打印副本呼叫签名?如果我将-readonly[P in keyof T]:Draft
更改为-readonly[P in keyof T]:T[P]
我可以调用方法,但是Draft
不会递归应用自身。我根据以下的正式实现提出了一个解决方案:
导出类型DraftObject={
-只读[P in keyof T]:草稿;
};
接口DraftArray扩展数组{}
出口型汇票=
T扩展任何[]?德拉法雷:
T扩展ReadOnlyRay?德拉法雷:
T扩展对象?DraftObject:
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;