У меня есть некоторый код JavaScript, который использует объекты в качестве словарей; например, объект person будет содержать некоторые личные данные, введенные в адрес электронной почты.
var people = {<email> : <'some personal data'>};
adding > "people[<email>] = <data>;"
getting > "var data = people[<email>];"
deleting > "delete people[<email>];"
Можно ли описать это в Typescript? или я должен использовать массив?
arrays
object
dictionary
typescript
Роберт Тейлор
источник
источник
Ответы:
В новых версиях машинописи вы можете использовать:
В старых версиях вы можете использовать:
Вы также можете создать интерфейс, если не хотите каждый раз выводить всю эту аннотацию типа:
источник
map
содержит два члена: (<any> Object.prototype) .something = function () {}; класс Customer {} var map: {[email: string]: Customer; знак равно map ['foo@gmail.com '] = новый клиент (); for (var i in map) {console.log (map [i])}var map:MapStringTo<Customer> = {};
В дополнении к использованию Map- как объект, там был фактический
Map
объект в течение некоторого времени, которое доступно в машинописном при компиляции в ES6, или при использовании polyfill с ES6 типовыми определениями :Он поддерживает те же функции
Object
, что и многие другие, с немного другим синтаксисом:Это само по себе имеет несколько преимуществ перед использованием подобного карте объекта, такого как:
Object
(нет,Object
не поддерживает числа, он преобразует их в строки)--noImplicitAny
, так какMap
всегда имеет тип ключа и тип значения , тогда как объект может не иметь подписи индексаObject
Кроме того,
Map
объект предоставляет более мощный и элегантный API для общих задач, большинство из которых недоступны через простыеObject
s без взлома вспомогательных функций (хотя для некоторых из них требуется полный итератор ES6 / итеративный полифилл для целей ES5 или ниже):источник
JSON.stringify()
, поэтому его можно использовать, например, для socket.io :(Map
сериализация довольно забавная. Я, например, выполняю преобразование в объекты пары ключ-значение перед сериализацией, а затем обратно (например, объект из{ key: "John", value: { firstName: "John" } }
).Вы можете использовать шаблоны интерфейсов, как это:
источник
let dict: Dictionary<number> = { "one": 1, "two": 2 };
Вы также можете использовать тип записи в машинописи:
источник
Lodash имеет простую реализацию словаря и имеет хорошую поддержку TypeScript
Установите Lodash:
Импорт и использование:
источник
Вы можете использовать
Record
для этого:https://www.typescriptlang.org/docs/handbook/utility-types.html#recordkt
Пример (отображение между перечислением AppointmentStatus и некоторыми метаданными):
Теперь с интерфейсом в качестве значения:
interface Icon { Name: string Color: string }
Использование:
const icon: SemanticIcon = iconMapping[appointment.Status]
источник
enum
илиclass/object
дляAppointmentStatus
- или это имеет значение?Есть библиотека, которая предоставляет строго типизированные, запрашиваемые коллекции в машинописи.
Коллекции:
Библиотека называется ts-generic-collection . ( Исходный код на GitHub )
Вы можете создать словарь и запросить его, как показано ниже:
источник