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



假设我有一个文字联合的类型:

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

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

你的方法是正确的。使用条件类型进行分发是实现此目的的方法。仅获取分发行为的推荐模式是 T extends TT extends unknown ,但在这种情况下,您的模式也可以正常工作。

type Arrayify<T> = T extends T ? T[] : never;

最新更新