如何解释这个索引符号:let value: 字典<number>['foo']?



我在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;

这将出错,因为idIMessage中被声明为字符串,而我们提供的值是一个数字。将1更改为"1"将清除此错误。请注意,IMessage只有一个属性id,访问任何其他属性都会导致访问器出错。

在您提供的示例中,界面为:

interface Dictionary<T> {
[key: string]: T;
}

访问Dictionary中的foo会得到key是字符串时的类型,即T。通过的Tnumber:

let value: Dictionary<number>['foo'];

相关内容

最新更新