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;