首先在http://www.typescriptlang.org/docs/handbook/advanced-types.html#example-1 中找到了代码
然后在打字稿代码库中找到了这个类似的代码:https : //github.com/microsoft/TypeScript/blob/master/tests/cases/conformance/types/conditional/conditionalTypes1.ts#L75
type KnockoutObservable<T> = { object: T };
type KnockoutObservableArray<T> = { array: T };
type KnockedOut<T> = T extends any[] ?
KnockoutObservableArray<T[number]> :
KnockoutObservable<T>;
type KnockedOutObj<T> = {
[P in keyof T]: KnockedOut<T[P]>;
}
Run Code Online (Sandbox Code Playgroud)
代码中的 T[number] 是什么意思?
在打字稿手册示例中,它说
数组的元素类型为 T[number]
在操场上测试时(仅用于测试),替换T[number]
为T
或T[any]
似乎没有什么不同,但不能替换为T[string]
(为什么?)。
在[number]
后T
,似乎不是一个索引。
使用时let s = Symbol()
把该符号声明作为对象的密钥,如:
let a = { [s]:1 }
Run Code Online (Sandbox Code Playgroud)
的类型a
将自动变为,{[x:string]:number}
而尝试索引时会出错a[s]
:
类型“符号”不能用作索引类型 (2538)
而 useconst s = Symbol()
声明是工作 as become to {[s]:number}
。