[英]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();
}
我的想法是,如果T
是Date
,則tick
是Date
,返回類型是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.