Учитывая следующий код
interface IPerson {
firstName: string;
lastName: string;
}
var persons: { [id: string]: IPerson; } = {
"p1": { firstName: "F1", lastName: "L1" },
"p2": { firstName: "F2" }
};
Почему инициализация не отклонена? В конце концов, второй объект не имеет свойства lastName.
Index signatures are incompatible.
Type '{ firstName: string; }' is not assignable to type 'IPerson'.
Property 'lastName' is missing in type '{ firstName: string; }'.
Ответы:
Редактировать : с тех пор это было исправлено в последних версиях TS. Цитируя комментарий @ Simon_Weaver к посту ОП:
Очевидно, это не работает при передаче начальных данных при объявлении. Я предполагаю, что это ошибка в TypeScript, поэтому вы должны исправить ее на сайте проекта.
Вы можете использовать типизированный словарь, разделив ваш пример в декларации и инициализации, например:
источник
id
символ? Кажется, это не нужно.id
символ, вы можете объявить тип ключей словаря. С заявлением выше, вы не можете сделать следующее:persons[1] = { firstName: 'F1', lastName: 'L1' }
id
символ можно назвать все , что вы , как и был разработан таким образом , чтобы сделать его более удобным для чтения кода. например{ [username: string] : IPerson; }
Для использования словарного объекта в машинописи вы можете использовать интерфейс, как показано ниже:
и используйте это для своего типа свойства класса.
использовать и инициализировать этот класс,
источник
Я согласен с thomaux, что ошибка проверки типа инициализации является ошибкой TypeScript. Тем не менее, я все еще хотел найти способ объявить и инициализировать словарь в одном выражении с правильной проверкой типа. Эта реализация длиннее, однако она добавляет дополнительные функции, такие как
containsKey(key: string)
иremove(key: string)
метод. Я подозреваю, что это можно упростить, когда дженерики станут доступны в версии 0.9.Сначала мы объявляем базовый класс Dictionary и интерфейс. Интерфейс необходим для индексатора, потому что классы не могут его реализовать.
Теперь мы объявляем конкретный тип Person и интерфейс Dictionary / Dictionary. В PersonDictionary обратите внимание, как мы переопределяем
values()
иtoLookup()
возвращаем правильные типы.А вот простой пример инициализации и использования:
источник
containsKey(key: string): bool;
не работает с TypeScript 1.5.0-beta . Это должно быть изменено наcontainsKey(key: string): boolean;
.Вот более общая реализация словаря, вдохновленная этим из @dmck
источник
Если вы хотите игнорировать свойство, отметьте его как необязательное, добавив знак вопроса:
источник
Теперь есть библиотека, которая предоставляет строго типизированные, запрашиваемые коллекции в машинописи.
Эти коллекции:
Библиотека называется ts-generic-collection-linq .
Исходный код на GitHub:
https://github.com/VeritasSoftware/ts-generic-collections
NPM:
https://www.npmjs.com/package/ts-generic-collections-linq
С помощью этой библиотеки вы можете создавать коллекции (например
List<T>
) и запрашивать их, как показано ниже.источник