2014-01-12 11 views
24

...和记录在哪里?散列变量语法在打字稿中如何工作?

我见过的例子是这样的地方周围:

class MyThing { 
    private _layers: { [id: string] : SimpleLayer } = {}; 
    ... 
} 

......和这样的作品,这是伟大的,但语法是混乱给我。

'id'是什么?为什么语法不仅仅是blah:{string:SimpleLayer},其中不起作用。我也见过{[name:string]:Type}和{[index:string]:Type}。

我一直在寻找typescriptlang.org试图找到这是实际记录,但我似乎无法找到它。

回答

27

http://blogs.msdn.com/b/typescript/archive/2013/01/24/interfaces-walkthrough.aspx

请参见 “描述的可转位的对象” 一节。这被称为index signature

的语法是:

[Identifier: KeyType]: ValueType 

KeyType可以是stringnumber

你可以声称Identifier并不是真的需要,因为它在任何地方都没有被使用,但我认为这是迫使类/接口设计者指出散列映射关键字应该代表什么(id ,姓名,电子邮件地址等)。这也提供了让intellisense显示散列键名称的可能性(就像Visual Studio为其他语言所做的那样),但我认为Typescript intellisense目前不提供此功能。

-1

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

,因为这将是不明确的。此语法已存在并且含义如下:

var x: { string: SimpleLayer } 

此声明变量xx的类型有一个属性,名称为string,类型为SimpleLayer。如果我想用x,我这样做:

x.string = new SimpleLayer; 

这是比较明显的,如果我们用一个真实的例子:

var circle: {radius: number} 

声明一个变量与一个属性(radius),该类型的number,它声明一个哈希映射radius类型为number类型。

+1

足够公平,但可以肯定的是,当前语法中的“标识符”是毫无意义的,由于技术限制而不是有意义的原因。 '{[TKey]:TValue}'或'{{TKey:TValue}}'或'Hash '或者其他的可以很容易地等同地明确。 – Doug