簡體   English   中英

打字稿可以縮小通用類型的聯合類型嗎?

[英]Could typescript narrow union type in generic type?

可以用這個意圖編譯代碼:

type Tick = Date | number;

type Unary<T, R> = (_: T) => R;

function formatter<T extends Tick>(tick: T): Unary<T, string> {
    if (tick instanceof Date) {
        return (date: Date) => date.toUTCString();
    }
    return (int: number) => int.toFixed();
}

游樂場鏈接

我的想法是,如果TDate ,則tickDate ,返回類型是Unary Unary<Date, string> ,但Typescript嘗試將它與Unary Unary<T, string>統一。 這是因為T extends Tick更廣泛而不僅僅是Tick聯盟? 如果是這樣,我可以限制這種通用嗎?

不要認為您可以縮小泛型類型的參數類型。 任何類型的gard仍將保留類型參數,因為編譯器假定類型參數可以是任何派生類型,因此它無法消除它不確定的內容。

此外,您要做的是基於對參數的檢查來縮小所有類型參數出現(即返回類型中的出現),這是絕對不可能的。 類型保護可以處理特定變量,而不是作為整體的類型。

一種選擇是使用單獨的實現簽名:

type Tick = Date | number;

type Unary<T, R> = (_: T) => R;

function formatter<T extends Tick>(tick: T): Unary<T, string> 
function formatter(tick: Tick): Unary<Date, string> | Unary<number, string> {
    if (tick instanceof Date) {
        return (date: Date) => date.toUTCString();
    }
    return (int: number) => int.toFixed();
}

暫無
暫無

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

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