分配泛型类型的值时,TypeScript编译错误TS2322

时间:2016-11-19 08:31:44

标签: generics typescript

我正在尝试创建一个具有两个类型参数的TypeScript函数,其中一个类型参数使用另一个:

interface Wrapper<T> {
    value: T;
}

function func<T, W extends Wrapper<T>>(val: T, takesWrapper: (w: W) => void) {
    const wrapper: W = { value: val };
    takesWrapper(wrapper);
}

func(32, num => { console.log(Math.abs(num.value) + 10); });

TypeScript编译器会为行const wrapper: W = { value: val };产生错误:

test.ts(6,11): error TS2322: Type '{ value: T; }' is not assignable to type 'W'.

但是,当W扩展Wrapper<T>时,{ value: val }类型为val的指定值T应该有效。

为什么TypeScript编译器在这种情况下会产生编译错误?

1 个答案:

答案 0 :(得分:2)

您正在创建可能无法分配给W的对象。例如:

interface ExtendedWrapper<T> extends Wrapper<T>{
    anotherValue: T;
}

{ value: 1 }无法分配给ExtendedWrapper<number>(缺少属性 anotherValue )。

您可以使用类型断言const wrapper = { value: val } as W;来克服此问题,但请记住takesWrapper函数需要扩展类型。