挑战

实现泛型TupleToUnion<T>,它返回由元组所有值组成的联合类型。

例如:

type Arr = ["1", "2", "3"];

const a: TupleToUnion<Arr>; // expected to be '1' | '2' | '3'

解答

我们需要获取一个数组中的所有元素并将其转化为联合类型。幸运的是,TypeScript 已经 在其类型系统中实现了这种功能—— lookup types。 我们可以使用构造T[number]得到由T的所有元素所组成的联合类型。

type TupleToUnion<T> = T[number];

但是,我们得到了一个 error: Type ‘number’ cannot be used to index type ‘T’。 这时因为我们没有向T施加约束,即没有告知编译器T是一个可以被索引的数组。

让我们通过添加extends unknown[]解决这个问题。

type TupleToUnion<T extends unknown[]> = T[number];

参考