在打字稿中,拥有一个像这样的对象 属性 “{ [x: string]: any }” 意味着什么?

In typescript what does it means to have an object property like this "{ [x: string]: any }"?

var x: { id: number, [x: string]: any }; // what does second property means?

x = { id: 1, fullname: "Zia" , 32: "Khan" }; // no errors in VS Code v0.9.1

如果第二个属性是Array类型,它的indexstring 并且 return value 是类型 any 那么它如何接受 indexnumber 类型,valuestring?

类型

TypeScript 版本:1.6.2

Visual Studio代码版本:0.9.1

In typescript what does it means to have an object property like this { [x: string]: any }?

这些称为 索引签名。它们包含在 TSLang Handbook.

签名 [x: string]: any 基本上是说使用字符串的任何索引访问的类型是 any.

假设我们有这个变量声明:

var x : { 
    id: number, 
    [index: string]: number  // This is not an object property! Note the brackets.
}; 

声明的意思是:你可以给变量x赋值一个数值为属性的对象id 并且如果您通过索引(即 x["something"])访问 x,则 return 值 必须为数字 .

所以你可以这样写:

x.id = 10;    // but not x.id = "Peter";
x["age"] = 20 // but not x["age"] = "old"

现在回到你的例子:

var x: { id: number, [x: string]: any }; // what does second property means?
x = { id: 1, fullname: "Zia", 32 : "Khan" }; // no errors in VS Code v0.9.1

fullname 在这里是一个有效的对象 属性 因为你定义了 x 可以作为数组访问。奇怪的是,32 索引出于同样的原因是有效的(尽管我希望这里只允许字符串索引)。