我在TypeScript手册的"高级类型"部分看到了这样的代码:
interface Dictionary<T> {
[key: string]: T;
}
let keys: keyof Dictionary<number>; // string | number
let value: Dictionary<number>['foo']; // number
我不能理解['foo']
,如果它只是声明索引是string
?
嗯,我发现['fo']肯定没有限制var必须是字典的键'foo'的值,下面的语句是等价的:
let value: Dictionary<number>['foo'];
let value: Dictionary<number>['abc'];
let value: Dictionary<number>[string];
对吗?
它按预期工作。
通用T
是指在字符串键下定义的对象值。
为了更好地理解,请参阅Dictionary类型的对象:
interface Dictionary<T> {
[key: string]: T;
}
const obj: Dictionary<number> = {
foo: 3, // ok
abc: '' // wrong - value must be a number
}
如果你得到一个obj['foo']
,你就会得到一个数字3,对吧?
对于Dictionary<number>['foo']
,这与您在"foo"键下请求Dictionary值的类型相同,因此它将始终返回T
(在我们的情况下是number
(。
由于接口是一个抽象,所以只有您可以选择您想要的任何键,所以Dictionary<number>['abc']
仍然返回相同的键。
您可以通过访问接口上的['valueOfKey']
来访问接口的类型。例如:
interface IMessage {
id: string;
}
const value: IMessage['id'] = 1;
这将出错,因为id
在IMessage
中被声明为字符串,而我们提供的值是一个数字。将1
更改为"1"
将清除此错误。请注意,IMessage
只有一个属性id
,访问任何其他属性都会导致访问器出错。
在您提供的示例中,界面为:
interface Dictionary<T> {
[key: string]: T;
}
访问Dictionary
中的foo
会得到key
是字符串时的类型,即T
。通过的T
是number
:
let value: Dictionary<number>['foo'];