[英]Typescript arrow functions overloads error 2322
下面的代碼工作正常,但它給出了resolve
常量的錯誤。
const resolve: Resolve
Type '(param: "case 1" | "case 2" | "case 3") => boolean | "string" | 1000' is not assignable to type 'Resolve'.(2322)
// Overloads
type Resolve = {
(): false;
(param: 'case 1'): string;
(param: 'case 2'): number;
(param: 'case 3'): true;
};
const resolve: Resolve = (param) => {
switch (param) {
case 'case 1':
return 'string';
case 'case 2':
return 1000;
case 'case 3':
return true;
default:
return false;
}
};
const result = {
first: resolve('case 1'),
second: resolve('case 2'),
third: resolve('case 3'),
none: resolve()
};
知道如何解決嗎?
通常情況下,重載函數的實現簽名與重載簽名不完全兼容。 當您使用重載語法時,TypeScript 使用寬松的兼容性規則。
在您的情況下,由於您沒有使用重載語法,因此您必須使用類型斷言(在確保function 對重載的行為正確之后):
const resolve = ((param?: "case 1" | "case 2" | "case 3"): string | number | true | false => {
switch (param) {
case "case 1":
return "string";
case "case 2":
return 1000;
case "case 3":
return true;
default:
return false;
}
}) as Resolve;
(我還為param
添加了一個類型注釋和一個返回類型注釋,只是為了更好的衡量,盡管在實現簽名中真正松散的情況並不少見。)
只是 FWIW,改用 function 重載語法( 游樂場鏈接):
function resolve(param: "case 1"): string;
function resolve(param: "case 2"): number;
function resolve(param: "case 3"): true;
function resolve(): false;
function resolve(param?: "case 1" | "case 2" | "case 3"): string | number | true | false {
switch (param) {
case "case 1":
return "string";
case "case 2":
return 1000;
case "case 3":
return true;
default:
return false;
}
};
type Resolve = typeof resolve;
...但這並不總是可能的,在沒有實際實現它的情況下必須定義類型的情況並不少見(例如,在 API 的回調類型中)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.