簡體   English   中英

基於字符串參數的打字稿條件返回類型

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

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