[英]Typescript generic interface parameter assignment
我正在努力理解为什么这个例子不被打字稿编译器认为是有效的:
interface IExample<T> {
param: T
}
function testFunc<U, I extends IExample<U>>(myParam: U): I {
return { param: myParam };
}
产生的错误是:
Type 'U' is not assignable to type 'I["param"]'.
我(可能不正确)对这段代码的解读是:
IExample<T>
期望param
类型为T
。I
是IExample<U>
的子类型,这意味着param
类型为U
。myParam
具有来自参数注释的类型U
myParam
应该是I
param
的有效值。 用<I>
前缀返回值会清除错误,那么为什么首先会出现错误呢?
问题是除了param
之外, I
可能还有其他必需的属性。 Typescript 将强制您的泛型函数实现为任何满足扩展IExample<U>
约束的I
返回有效值,但事实并非如此。
例如:
interface DerivedIExample extends IExample<number> {
other : string
}
let o = testFunc<number, DerivedIExample>(0)
o.other // required by the DerivedIExample but not assigned
在您的简单示例中,最好完全取消I
:
function testFunc<U>(myParam: U): IExample<U> {
return { param: myParam };
}
您可以使用类型断言强制编译器接受您的代码,但如上所述,这不是类型安全的:
function testFunc<U, I extends IExample<U>>(myParam: U): I {
return { param: myParam } as I; // NOT TYPE SAFE! USE WITH CARE !
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.