Как синтаксис хэш-переменной работает в typescript?
... и где он задокументирован?
Я видел такие примеры вокруг этого места:
class MyThing {
private _layers: { [id: string] : SimpleLayer } = {};
...
}
... и это работает, что здорово, но синтаксис меня сбивает с толку.
Что такое 'id'? Почему синтаксис не просто blah: {string: SimpleLayer}, который не работает. Я также видел {[имя: строка]: Тип} и {[индекс: строка]: Тип}.
Я просматривал typescriptlang.org, пытаясь найти, где это действительно документировано, но я не могу найти его вообще.
Ответы
Ответ 1
http://blogs.msdn.com/b/typescript/archive/2013/01/24/interfaces-walkthrough.aspx
См. раздел "Описание индексируемого объекта". Это называется подписью индекса.
Синтаксис:
[Identifier: KeyType]: ValueType
KeyType
может быть либо string
, либо number
.
Вы можете утверждать, что Identifier
на самом деле не нужен, поскольку он нигде не используется, но я думаю, что это необходимо для того, чтобы заставить конструктор класса/интерфейса указать, что должен представлять ключ карты хэша ( id, имя, адрес электронной почты и т.д.). Это также дает возможность иметь intellisense показать имя хэш-ключа (как Visual Studio для других языков), хотя я не думаю, что Typescript intellisense в настоящее время предоставляет это.
Ответ 2
Что касается вашего вопроса о том, почему синтаксис не проще, в частности что-то вроде blah:{string:SimpleLayer}
:
Потому что это было бы двусмысленно. Этот синтаксис уже существует и имеет смысл:
var x: { string: SimpleLayer }
Объявляет переменную x
. Тип x
имеет одно свойство с именем string
, которое имеет тип SimpleLayer
. Если бы я хотел использовать x
, я бы сделал это:
x.string = new SimpleLayer;
Это более очевидно, если мы используем реальный пример:
var circle: {radius: number}
Это объявляет переменную с одним свойством (radius
), которое имеет тип number
, оно не объявляет хеш-отображение типов radius
типа number
.