Подтвердить что ты не робот

Как синтаксис хэш-переменной работает в typescript?

... и где он задокументирован?

Я видел такие примеры вокруг этого места:

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

... и это работает, что здорово, но синтаксис меня сбивает с толку.

Что такое 'id'? Почему синтаксис не просто blah: {string: SimpleLayer}, который не работает. Я также видел {[имя: строка]: Тип} и {[индекс: строка]: Тип}.

Я просматривал typescriptlang.org, пытаясь найти, где это действительно документировано, но я не могу найти его вообще.

4b9b3361

Ответ 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.