【问题标题】:Distribute a generic type over a union在联合上分配泛型类型
【发布时间】:2020-12-03 15:37:24
【问题描述】:

TS 中有没有办法通过联合“分发”泛型类型?

type Container<A> = { value: A };

type Containers<string | number> = Container<string> | Container<number>

(假设我们从上下文中知道何时应用Containers vs Container

【问题讨论】:

    标签: typescript generics types union


    【解决方案1】:

    令人惊讶的是,类型推断会为您做到这一点:

    type Container<T> = { value: T }
    
    type Containers<T> = T extends infer A ? Container<A> : never;
    

    编译器足够聪明,可以将它们全部脱节:

    type C = Containers<string | number | {x: number} | {z: string} | boolean>
    

    type C 扩展如下:

    type C = Container<string> | 
             Container<number> | 
             Container<false> | 
             Container<true> | 
             Container<{
               x: number;
             }> | 
             Container<{
               z: string;
             }>
    

    ts-playground

    【讨论】:

    • 太棒了!这正是我想要的,非常感谢?
    【解决方案2】:

    鉴于您的示例代码,我认为您想要定义一个受限于类型联合的泛型类型。其中之一应该符合您的要求。

    type Container<T> = { value: T };
    type ContainerA = Container<string | number>;
    type ContainerB = Container<string> | Container<number>
    type ContainerC<T extends string | number> = Container<T>;
    

    还要注意Spread 是 JavaScript 中的语法规则。它在您的问题中的用法令人困惑。

    【讨论】:

    • @leetwinski 的回答更符合我的需要,但谢谢!你说得对,我把它改成“分发”?干杯
    猜你喜欢
    • 2016-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-24
    • 2021-11-11
    • 1970-01-01
    相关资源
    最近更新 更多