簡體   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