Объекты 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> 
}