[英]Typescript union type generic parameter
所以我有以下代码示例:
interface MyInterface<T> {
myFunc(value: T): void;
}
class MyImplementation implements MyInterface<number> {
myFunc(value: number): void {
console.log(value / 2);
}
}
function myTest(): MyInterface<number|string> {
return new MyImplementation(); // doesn't look quite right
}
myTest().myFunc("I am not a number"); // outputs NaN
我不太明白为什么 typescript 允许我返回MyImplementation代替MyInterface<number | 字符串> 。 我知道我们希望number可以分配给number | 字符串,但肯定不适用于泛型参数。
此示例在没有 generics 的情况下也适用:
interface MyInterface {
myFunc(value: number): void;
}
interface MyInterface2 {
myFunc(value: number|string): void;
}
class MyImplementation implements MyInterface {
myFunc(value: number): void {
console.log(value / 2);
}
}
function myTest(): MyInterface2 {
return new MyImplementation(); // doesn't look quite right
}
myTest().myFunc("I am not a number"); // outputs NaN
Typescript 被设计为在类型系统中存在一些不健全,如下所述: https://www.typescriptlang.org/docs/handbook/type-compatibility.ZFC35FDC70D5FC69D2693EZ5A
要解决此问题,您可以像这样定义您的界面:
interface MyInterface<T> {
myFunc: (value: T) => void;
}
然后在您的tsconfig.json
中启用strictFunctionTypes
或strict
。
另见: https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-6.html
更严格的检查适用于所有 function 类型,但源自方法或构造函数声明的类型除外。 专门排除方法以确保泛型类和接口(例如 Array)继续主要以协变方式相关。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.