与条件泛型和数组相关的独特 Typescript 语法
Unique Typescript syntax relating conditional generics and arrays
我偶然发现了某种 Typescript 语法,我觉得很困惑。以下是 Typescript 团队成员编写的两个示例。
示例 1
type BoxedArray<T> = { array: T[] };
type Boxed<T> = T extends any[] ? BoxedArray<T[number]> : BoxedValue<T>;
type T21 = Boxed<number[]>; // BoxedArray<number>;
这是我天真的阅读方式:
// Boxed receives a type parameter - T = number[]
// Boxed passes BoxedArray an Array of T
// Therefore type T21 = BoxedArray<number[][]>
示例 2
type DeepReadonly<T> =
T extends any[] ? DeepReadonlyArray<T[number]> :
T extends object ? DeepReadonlyObject<T> :
T;
interface DeepReadonlyArray<T> extends ReadonlyArray<DeepReadonly<T>> {}
我理解这个语法有点类似于infer。我在这里和那里看到过它,但我仍然不太了解它的结构,也找不到有关它的信息。
类型T[K]
是一个lookup type,意思是T[K]
是键[=13=处T
的属性的值的类型]. (请注意,T[K]
不是 T[]
。)如果 T
具有数字索引签名(如数组),则 T[number]
是存储在 属性 的类型T
的数字索引。具体来说,如果 T
是 Array<X>
,那么 T[number]
就是 X
。 (这确实导致令人困惑的 string[][number]
与 string
相同)。希望有所帮助。祝你好运!
我偶然发现了某种 Typescript 语法,我觉得很困惑。以下是 Typescript 团队成员编写的两个示例。
示例 1
type BoxedArray<T> = { array: T[] };
type Boxed<T> = T extends any[] ? BoxedArray<T[number]> : BoxedValue<T>;
type T21 = Boxed<number[]>; // BoxedArray<number>;
这是我天真的阅读方式:
// Boxed receives a type parameter - T = number[]
// Boxed passes BoxedArray an Array of T
// Therefore type T21 = BoxedArray<number[][]>
示例 2
type DeepReadonly<T> =
T extends any[] ? DeepReadonlyArray<T[number]> :
T extends object ? DeepReadonlyObject<T> :
T;
interface DeepReadonlyArray<T> extends ReadonlyArray<DeepReadonly<T>> {}
我理解这个语法有点类似于infer。我在这里和那里看到过它,但我仍然不太了解它的结构,也找不到有关它的信息。
类型T[K]
是一个lookup type,意思是T[K]
是键[=13=处T
的属性的值的类型]. (请注意,T[K]
不是 T[]
。)如果 T
具有数字索引签名(如数组),则 T[number]
是存储在 属性 的类型T
的数字索引。具体来说,如果 T
是 Array<X>
,那么 T[number]
就是 X
。 (这确实导致令人困惑的 string[][number]
与 string
相同)。希望有所帮助。祝你好运!