在联合上分配泛型类型

Tho*_*art 3 generics union types typescript

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

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

type Containers<string | number> = Container<string> | Container<number>
Run Code Online (Sandbox Code Playgroud)

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

lee*_*ski 6

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

type Container<T> = { value: T }

type Containers<T> = T extends infer A ? Container<A> : never;
Run Code Online (Sandbox Code Playgroud)

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

type C = Containers<string | number | {x: number} | {z: string} | boolean>
Run Code Online (Sandbox Code Playgroud)

type 按C以下方式扩展:

type C = Container<string> | 
         Container<number> | 
         Container<false> | 
         Container<true> | 
         Container<{
           x: number;
         }> | 
         Container<{
           z: string;
         }>
Run Code Online (Sandbox Code Playgroud)

ts-游乐场