TypeScript 分发条件类型 - 附加类型参数约束



我正在尝试理解TypeScript 2.8中引入的条件类型,并阅读以下官方文档。

https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-8.html

在分布条件类型中,有一个示例

type BoxedValue<T> = { value: T };
type BoxedArray<T> = { array: T[] };
type Boxed<T> = T extends any[] ? BoxedArray<T[number]> : BoxedValue<T>;
type T20 = Boxed<string>;  // BoxedValue<string>;
type T21 = Boxed<number[]>;  // BoxedArray<number>;
type T22 = Boxed<string | number[]>;  // BoxedValue<string> | BoxedArray<number>;

在上面的例子中,我不明白T[number]BoxedArray<T[number]>

它指的是传递的数组的第一个元素还是这里发生了什么?

有人可以帮我解释一下吗?

提前谢谢。

这是查找类型的(另一种(用法。基本上,T[number]认为是任何数字索引可访问的任何元素的类型。

对于统一数组(每个元素都有相同的类型(,这与返回第一个元素类型的 doT[0]相同。


然而,情况并非总是如此。这是因为TypeScript也有元组的概念。

元组类型允许您表示具有固定数量的元素的数组,这些元素的类型是已知的,但不必相同。

假设我们有这个元组:

type Tuple = [string, number, string];

第一个元素和最后一个元素的类型是string,但第二个是number。使用查找类型,我们可以访问不同的索引:

Tuple[0] // -> string
Tuple[1] // -> number
Tuple[2] // -> string

因此,如果我们在查找类型中使用number,我们得到的不是单个元素的类型,而是所有可能类型的联合:

Tuple[number] // -> string | number

它是一种"查找类型"或"索引访问类型"。A[B]是使用类型B的键索引到类型A的对象时获得的值的类型。 因此,当您使用数字键索引到类型T的对象时,您将获得T[number]。 请注意,仅当已知T具有数字索引签名时,才会编译此类类型...例如,如果T是数组类型,则T[number]是数组元素的类型。

因此,T extends any[] ? BoxedArray<T[number]> : BoxedValue<T>的意思是"对于T的每个联合成员:如果它是数组类型,则生成其元素类型的BoxedArray;否则,产生一个BoxedValue,并将它们全部连接成一个联盟",如示例所示。

希望有帮助;祝你好运!

最新更新