繁体   English   中英

Typescript 联合类型泛型参数

[英]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中启用strictFunctionTypesstrict

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM