TypeScript分布式条件类型-其他类型参数约束

时间:2019-09-13 13:34:33

标签: typescript typescript2.0 typescript-generics

我试图理解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]>

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

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

谢谢。

2 个答案:

答案 0 :(得分:3)

这是“ lookup type”或“索引访问类型”。 A[B]是在使用A类型的键索引到B类型的对象时获得的值的类型。因此,T[number]是使用数字键索引到T类型的对象中时得到的。请注意,只有在已知T具有numeric index signature ...的情况下,才会编译这种类型,例如,如果T是数组类型,则T[number]是该类型数组元素。

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

希望有所帮助;祝你好运!

答案 1 :(得分:2)

(另外)使用lookup types。基本上将T[number]视为可由任何数字索引访问的任何元素的类型。

对于统一数组(每个元素具有相同的类型),这与进行T[0]返回第一个元素的类型相同。


但是,并非总是如此。这是因为TypeScript也具有tuples的概念。

  

元组类型使您可以用固定数量的元素表示数组,这些元素的类型是已知的,但不必相同。

假设我们有这个元组:

type Tuple = [string, number, string];

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

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

因此,如果在查找类型中使用number,则不会得到单个元素的类型,而是所有可能类型的并集:

Tuple[number] // -> string | number