在联合上分配通用类型
Distribute a generic type over a union
TS 中有没有一种方法可以通过联合“分发”泛型类型?
type Container<A> = { value: A };
type Containers<string | number> = Container<string> | Container<number>
(假设我们从上下文中知道何时应用 Containers
与 Container
)
鉴于您的示例代码,我认为您想要定义一个泛型类型,该类型受限于类型的联合。其中之一应该符合您的要求。
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 中有没有一种方法可以通过联合“分发”泛型类型?
type Container<A> = { value: A };
type Containers<string | number> = Container<string> | Container<number>
(假设我们从上下文中知道何时应用 Containers
与 Container
)
鉴于您的示例代码,我认为您想要定义一个泛型类型,该类型受限于类型的联合。其中之一应该符合您的要求。
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;
}>