[英]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
中啟用strictFunctionTypes
或strict
。
另見: https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-6.html
更嚴格的檢查適用於所有 function 類型,但源自方法或構造函數聲明的類型除外。 專門排除方法以確保泛型類和接口(例如 Array)繼續主要以協變方式相關。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.