我正在尝试创建一个具有两个类型参数的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编译器在这种情况下会产生编译错误?
答案 0 :(得分:2)
您正在创建可能无法分配给W
的对象。例如:
interface ExtendedWrapper<T> extends Wrapper<T>{
anotherValue: T;
}
{ value: 1 }
无法分配给ExtendedWrapper<number>
(缺少属性 anotherValue )。
您可以使用类型断言const wrapper = { value: val } as W;
来克服此问题,但请记住takesWrapper
函数需要扩展类型。