在TypeScript中分布式应用数组运算符

在TypeScript中分布式应用数组运算符,typescript,types,conditional-types,Typescript,Types,Conditional Types,假设我有一个类型,它是文字的并集: type X = "a" | "b" | "c"; 现在我想引入一个新类型,表示X中每种类型的数组的并集。换句话说,我想在并集上分布应用数组运算符 仅在类型上添加数组运算符并不能满足我的要求–这将允许使用混合数组,例如 type Y = X[]; // ("a" | "b" | "c")[] const xs: Y = ["a", "b"]; // valid 但是,条件类型具有我所寻求的分配属性。我似乎能够通过将它们与从未实现的条件结合使用来实现我的目标

假设我有一个类型,它是文字的并集:

type X = "a" | "b" | "c";
现在我想引入一个新类型,表示X中每种类型的数组的并集。换句话说,我想在并集上分布应用数组运算符

仅在类型上添加数组运算符并不能满足我的要求–这将允许使用混合数组,例如

type Y = X[]; // ("a" | "b" | "c")[]
const xs: Y = ["a", "b"]; // valid
但是,条件类型具有我所寻求的分配属性。我似乎能够通过将它们与从未实现的条件结合使用来实现我的目标:

type Arrayify<T> = T extends never ? never : T[];
type Y = Arrayify<X>; // "a"[] | "b"[] | "c"[]
const xs: Y = ["a", "b"]; // invalid
类型Arrayify=T从不扩展?从不:T[];
类型Y=Arrayify;//“a”[]|“b”[]|“c”[]
常量xs:Y=[“a”,“b”];//无效的

据我所知,它解决了我的问题,但绕道条件类型只获得分配性感觉有点倒退。有更好、更传统的方法吗?

你的方法是正确的。使用条件类型进行分发是实现这一点的方法。建议使用的模式是
T extends T
T extends unknown
,但您的模式在这种情况下也可以正常工作

type Arrayify<T> = T extends T ? T[] : never;
type Arrayify=T扩展了T?T[]:从不;

我刚刚意识到,将这种方法应用于布尔函数有一点复杂,因为它们被定义为
true | false
并集。因此,
Arrayify
将导致
true[]| false[]
而不是
boolean[]
。有什么方法可以“阻止”分配性吗?@HannesPetri阻止分配性的通常方法是使用元组。这应该有效:
typearrayify=[T]扩展了[boolean]?T[]:T扩展了T?T[]:从不尽管在枚举上仍然会得到奇怪的分布。