[英]Typescript conditional return type based on string argument
當使用字符串文字的聯合作為輸入參數時,刪除強制轉換並將類型放入函數頭中需要什么:
const get = <T extends "barcode" | "mqtt">(s: T) =>
s === "barcode" ?
<T extends "barcode" ? {scan: () => string} : {pan: () => string}>{scan: () => "we are scanning"} :
<T extends "barcode" ? {scan: () => string} : {pan: () => string}>{pan: () => "we are panning"}
get("barcode").scan() // OK
get("mqtt").pan() // OK
get("barcode").pan() // Error
我在試圖回答別人的問題時遇到了這個問題: https ://stackoverflow.com/a/55059318/2684980。
最干凈的解決方案是使用重載代替這種情況(盡管沒有比類型斷言更安全的類型)。 您可以在公共簽名中使用條件類型,並在實現簽名中使用簡單的聯合。 您需要切換到函數聲明,因為函數表達式(箭頭或正則)不容易支持重載:
function get<T extends "barcode" | "mqtt">(s: T): T extends "barcode" ? { scan: () => string } : { pan: () => string }
function get(s: "barcode" | "mqtt"): { scan: () => string } | { pan: () => string } {
return s === "barcode" ?
{ scan: () => "we are scanning" } :
{ pan: () => "we are panning" }
}
get("barcode").scan() // OK
get("mqtt").pan() // OK
get("barcode").pan() // Error
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.