【问题标题】:Create union type based on array of types基于类型数组创建联合类型
【发布时间】:2019-10-06 08:49:17
【问题描述】:

是否可以这样定义联合类型:

Union<T extends any[]> = // something...

并且会像

一样使用
Union<[string, number]> // would create (string | number)

我知道我可以立即在上面定义联合,但我需要它用于泛型,它最终会像 Union&lt;[TDynamic, UDynamic]&gt;

【问题讨论】:

    标签: typescript generics union typescript-generics


    【解决方案1】:

    您可以使用以下类型:

    type Union<T extends any[]> = T extends (infer U)[] ? U : never;
    

    这实际上与docs 中定义的Unpacked 的类型基本相同,并且之所以有效,是因为在这种情况下类型元组变成了类型联合。

    type X1 = Union<[number, string]>; // string | number
    type X2 = Union<[number, number]>; // number
    type X3 = Union<[number]>; // number
    

    如果您使用的是不支持 infer 的旧版 TypeScript,您也可以使用:

    type Union<T extends any[]> = T[number];
    

    【讨论】:

    • 完美,有什么方法可以定义像 Union (支持动态数量的通用参数,所以我不必添加数组定义)?
    • 如果可以写Union&lt;T1, T2&gt;,为什么不直接写T1 | T2呢?我不认为你需要一个单独的类型。
    • 因为我将在泛型定义中使用它,但我明白你的意思,因为无论如何我都无法在泛型定义中那样传递它(将具有动态类型数组)。如果您不介意,还有一个问题 - 是否可以创建 Intersection 类型(与上述 Union 相同)?
    • 您可以使用@jcalz 的UnionToIntersection 技巧使其工作:stackoverflow.com/a/50375286/1675492
    猜你喜欢
    • 2021-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-14
    • 1970-01-01
    相关资源
    最近更新 更多