Typescript联合类型通用参数

时间:2020-08-04 17:37:13

标签: typescript generics union-types

所以我有以下代码示例:

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 。我了解我们希望将 数字 分配给 数字|字符串 ,但肯定不是通用参数。

1 个答案:

答案 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中启用stricttsconfig.json

另请参阅:https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-6.html

更严格的检查适用于所有功能类型,但那些功能类型除外 源于方法或构造函数声明。方法是 专门排除以确保通用类和接口(例如 如Array)继续主要是协变的。