【问题标题】:Typescript union type generic parameter打字稿联合类型泛型参数
【发布时间】:2020-08-05 07:05:51
【问题描述】:

所以我有以下代码示例:

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 |字符串,但肯定不是泛型参数。

【问题讨论】:

    标签: typescript generics union-types


    【解决方案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
    

    Typescript 被设计为在类型系统中存在一些不健全,如下所述:https://www.typescriptlang.org/docs/handbook/type-compatibility.html

    要解决这个问题,您可以像这样定义您的界面:

    interface MyInterface<T> {
      myFunc: (value: T) => void;
    }
    

    然后在您的tsconfig.json 中启用strictFunctionTypesstrict

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

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

    【讨论】:

    • 感谢您提供清晰的答案。将函数声明为属性而不是方法确实可以在我的 typescript 配置中启用 --strict。
    猜你喜欢
    • 2021-09-02
    • 2018-05-02
    • 2019-09-23
    • 1970-01-01
    • 1970-01-01
    • 2021-02-25
    • 2020-12-22
    • 2021-11-26
    • 2017-05-18
    相关资源
    最近更新 更多