哈希变量语法在typescript中是如何工作的?

哈希变量语法在typescript中是如何工作的?,typescript,Typescript,…记录在哪里 我在这里看到过这样的例子: class MyThing { private _layers: { [id: string] : SimpleLayer } = {}; ... } …这很有效,这很好,但语法让我感到困惑 什么是“id”?为什么语法不仅仅是废话:{string:SimpleLayer},这是行不通的。我还看到了{[name:string]:Type}和{[index:string]:Type} 我一直在查看typescriptlang.org,试图找到它的实

…记录在哪里

我在这里看到过这样的例子:

class MyThing {
  private _layers: { [id: string] : SimpleLayer } = {};
  ...
}
…这很有效,这很好,但语法让我感到困惑

什么是“id”?为什么语法不仅仅是废话:{string:SimpleLayer},这是行不通的。我还看到了{[name:string]:Type}和{[index:string]:Type}

我一直在查看typescriptlang.org,试图找到它的实际记录位置,但我似乎根本找不到它。

请参阅“描述可转位对象”一节。这被称为一个

定义索引的语法为:

[Identifier: KeyType]: ValueType
KeyType
可以是
string
number


您可以声明,实际上并不需要
标识符,因为它在任何地方都不会被使用,但我认为它是必需的,以便强制类/接口设计器指示哈希映射键应该表示什么(id、名称、电子邮件地址等)。这还提供了让intellisense显示哈希键名称的可能性(就像Visual Studio对其他语言所做的那样),尽管我认为Typescript intellisense目前没有提供此功能。

关于语法为什么不更简单的问题,特别是类似于
blah:{string:SimpleLayer}
:

因为这是不明确的。此语法已存在,并具有以下含义:

var x: { string: SimpleLayer }
这声明了一个变量
x
x
的类型有一个属性,名为
string
,属于
SimpleLayer
类型。如果我想使用
x
,我会这样做:

x.string = new SimpleLayer;
如果我们使用一个真实的例子,则更为明显:

var circle: {radius: number}

这声明了一个具有一个属性(
radius
)的变量,该属性的类型为
number
,它没有声明将
radius
类型散列映射到
number
类型。

这很公平,但可以肯定的是,由于技术限制,当前语法中的“标识符”毫无意义,而不是有意义的理由
{[TKey]:TValue}
{{{TKey:TValue}}
散列
或类似的方法很容易就相当明确了。我多次回到这个答案,因为我总是忘记这个语法。。。但是,当我复制/粘贴您的解决方案时,我对大量错误感到困惑,这让我感到震惊。。我想粘贴的是
{[Identifier:KeyType]:ValueType}
@brianc我可以理解这种混淆,但这里我描述了在类型定义中定义索引的语法。除了索引外,类型还可能具有显式命名的属性:
{[id:number]:MyType、myProperty:string、myOtherProperty:boolean}
true。。。我恰好在这里登陆,因为
typescript散列语法的第一个谷歌结果是这样的。