我正在建立一个应该像Partial<T>
一样工作的类型。但是,递归也应该覆盖数组。
我为PartialRecursive<T>
创建了一个类型定义,该定义可以与我能想到的任何预定义类型完美配合。包括数组。看起来像这样:
type PartialRecursive<T> = T extends object
? PartialRecursiveObject<T>
: T extends (infer U)[]
? PartialRecursiveArray<U>
: T;
type PartialRecursiveObject<T> = {
[P in keyof T]?: PartialRecursive<T[P]>;
};
interface PartialRecursiveArray<U> extends Array<PartialRecursive<U>> { }
我希望该定义也适用于泛型。但是以某种方式与泛型一起使用时,它会失败。例如:
const mergeDeep = <TLeft, TRight>(
left: TLeft,
right: TRight,
) => {
let myVar: PartialRecursive<TLeft & TRight> = left;
};
引发编译错误。 error Type 'TLeft' is not assignable to type 'PartialRecursive<TLeft & TRight>'
但是具有预定义类型的同一件事绝对正确。例如:
type TLeft = {
a: string;
b: number;
}
type TRight = [{
c: number;
}]
let myVar: TLeft = {
a: 'asdasd',
b: 2
};
let partial: PartialRecursive<TLeft & TRight> = myVar;