PartialRecursive <T>不适用于泛型

时间:2019-09-30 10:57:56

标签: typescript

我正在建立一个应该像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;

Playground link

0 个答案:

没有答案