在联合上分配通用类型

Distribute a generic type over a union

TS 中有没有一种方法可以通过联合“分发”泛型类型?

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

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

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

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

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 中的语法规则。它在你的问题中的用法令人困惑。

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

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>

类型 C 扩展如下:

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

ts-playground