簡體   English   中英

帶有枚舉參數的 Typescript 重載函數不接受枚舉值的並集

[英]Typescript overloaded function with enum argument does not accept the union of enum values

這可能是因為我對枚舉在 Typescript 中的工作方式有誤解,但我仍然覺得它非常不直觀。

在我使用的庫中,有一個具有完全相同簽名的重載函數,唯一的區別是第一個簽名使用枚舉類型的一個成員作為參數,另一個使用另一個成員。

我似乎無法使用枚舉成員的聯合來調用此函數。 如果我使用枚舉成員的數字文字來調用函數,那就沒問題了。 請參閱此處的簡化示例:

打字稿游樂場鏈接

declare enum ArgType {
    FIRST = 1,
    SECOND = 2
}

declare function create(name: string, options: ArgType.FIRST): number;
declare function create(name: string, options: ArgType.SECOND): number;

//^^^^ Above is library code
//Below is me trying to use it

create("asd", ArgType.FIRST); //works
create("asd", ArgType.SECOND); //works

create("asd", Math.random() < 0.5 ? 1 : 2); //works
create("asd", Math.random() < 0.5 ? ArgType.FIRST : ArgType.SECOND); //ERROR

let one = ArgType.FIRST;
let two = ArgType.SECOND;
create("asd", Math.random() < 0.5 ? one : 2); //works
create("asd", Math.random() < 0.5 ? 1 : two); //works
create("asd", Math.random() < 0.5 ? one : two); //ERROR

有人可以解釋這里的行為並告訴我如何使用ArgType.FIRSTArgType.SECOND有條件地調用此創建函數,而無需在呼叫站點對數字進行硬編碼?

該“錯誤行”中的第二個參數是:
Math.random() < 0.5 ? ArgType.FIRST : ArgType.SECOND
打字稿類型為ArgType

ArgType不是定義的create函數重載的有效參數。

您可以通過將參數轉換為Number或使用as來解決該問題:

create("asd", Number(Math.random() < 0.5 ? ArgType.FIRST : ArgType.SECOND));
create("asd", (Math.random() < 0.5 ? ArgType.FIRST : ArgType.SECOND) as number);

這將強制 TS 將參數解釋為該枚舉的值。

如果您可以添加另一個重載,則可以添加以下內容,然后它將接受聯合類型:

declare function create(name: string, options: ArgType.FIRST | ArgType.SECOND): number;

你也可以把它包裝成一個自定義函數:

const wrappedCreate = (name: string, options: ArgType.FIRST | ArgType.SECOND) => {
    return options === ArgType.FIRST ? create(name, options) : create(name, options)
}
wrappedCreate("asd", Math.random() < 0.5 ? ArgType.FIRST : ArgType.SECOND);

或者您可以使用類型轉換而不是三元運算符

const wrappedCreate = (name: string, options: ArgType.FIRST | ArgType.SECOND) {
    return create(name, options as ArgType.FIRST)
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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