首页 > 解决方案 > 打字稿可以缩小泛型类型中的联合类型吗?

问题描述

可以用这种意图编译代码:

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();
}

游乐场链接

我的想法是 if Tis DatetickisDate和 return type is Unary<Date, string>,但 Typescript 尝试将其与Unary<T, string>. 是因为T extends TickTick工会更广泛吗?如果是这样,我可以限制这个泛型吗?

标签: typescript

解决方案


不要认为您可以缩小泛型参数的类型。由于编译器假定类型参数可以是任何派生类型,因此任何类型 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();
}

推荐阅读