所以我有以下代码示例:
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
我不太了解为什么打字稿允许我返回 MyImplementation
代替 MyInterface
答案 0 :(得分:1)
此示例也可以在没有泛型的情况下使用:
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
打字稿被设计为在打字稿系统中有些不完善,如此处所述:https://www.typescriptlang.org/docs/handbook/type-compatibility.html
要解决此问题,您可以这样定义您的界面:
interface MyInterface<T> {
myFunc: (value: T) => void;
}
然后在您的strictFunctionTypes
中启用strict
或tsconfig.json
。
另请参阅:https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-6.html
更严格的检查适用于所有功能类型,但那些功能类型除外 源于方法或构造函数声明。方法是 专门排除以确保通用类和接口(例如 如Array)继续主要是协变的。