簡體   English   中英

Typescript 箭頭函數重載錯誤 2322

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM