Объекты TypeScript как типы словарей, как в C#
У меня есть код JavaScript, который использует объекты в качестве словарей; например, объект "person" будет содержать некоторые личные данные, отключенные от адреса электронной почты.
var people = {<email> : <some personal data'>};
adding > "people[<email>] = <data>;"
getting > "var data = people[<email>];"
deleting > "delete people[<email>];"
можно ли описать это в TypeScript? или мне нужно использовать массив?
5 ответов
обязательно:
var map: { [email: string]: Customer; } = { };
map['foo@gmail.com'] = new Customer(); // OK
map[14] = new Customer(); // Not OK, 14 is not a string
map['bar@hotmail.com'] = 'x'; // Not OK, 'x' is not a customer
вы также можете сделать интерфейс, если вы не хотите вводить всю аннотацию типа каждый раз:
interface StringToCustomerMap {
[email: string]: Customer;
}
var map: StringToCustomerMap = { };
// Equivalent to first line of above
вы можете использовать шаблонные интерфейсы, такие как:
interface Map<T> {
[K: string]: T;
}
let dict: Map<number> = {};
dict["one"] = 1;
в дополнение к использованию карты -как объект, был фактический Map
объект в течение некоторого времени, которое доступно в TypeScript при компиляции в ES6 или при использовании polyfill с ES6 тип-определения:
let people = new Map<string, Person>();
он поддерживает ту же функциональность, как Object
и многое другое, с немного другой синтаксис:
// Adding an item (a key-value pair):
people.set("John", { firstName: "John", lastName: "Doe" });
// Checking for the presence of a key:
people.has("John"); // true
// Retrieving a value by a key:
people.get("John").lastName; // "Doe"
// Deleting an item by a key:
people.delete("John");
это одно имеет несколько преимуществ над использованием карта -как
Lodash имеет простую реализацию словаря и имеет хорошую поддержку TypeScript
Установить Lodash:
npm install lodash @types/lodash --save
импорт и использование:
import { Dictionary } from "lodash";
let properties : Dictionary<string> = {
"key": "value"
}
console.log(properties["key"])
вы также можете использовать тип записи в typescript:
export interface nameInterface {
propName : Record<string, otherComplexInterface>
}