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