Вы не можете. Это следует за соглашением Java Bean. Поэтому у вас должен быть геттер.
Конечно:
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;
let dict: Dictionary<number> = { "one": 1, "two": 2 };
– PhiLho
11 July 2017 в 17:44
В дополнение к использованию объекта map- , подобного , в течение некоторого времени был фактический 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");
Это само по себе имеет несколько преимуществ перед использованием объекта map- , подобного , например:
Object
(нет, Object
не поддерживает числа, он преобразует их в строки) --noImplicitAny
, как Map
всегда имеет тип и тип значение , тогда как объект может не иметь индексной подписи Object
Кроме того, [Map
обеспечивает более мощный и элегантный API для обычных задач, большинство из которых недоступны с помощью простых Object
s без взлома вспомогательных функций (хотя для некоторых из них требуется полный итеративный итеративный полигон ES6 для целей ES5 или ниже) :
// Iterate over Map entries:
people.forEach((person, key) => ...);
// Clear the Map:
people.clear();
// Get Map size:
people.size;
// Extract keys into array (in insertion order):
let keys = Array.from(people.keys());
// Extract values into array (in insertion order):
let values = Array.from(people.values());
JSON.stringify()
, поэтому его можно использовать, например. для socket.io :(
– Lion
25 May 2018 в 17:23
Map
сериализация довольно забавная. Я, например, выполняю преобразование объектов с ключом-значностью перед сериализацией, а затем обратно (например, объект { key: "John", value: { firstName: "John" } }
).
– John Weisz
25 May 2018 в 19:30
Lodash имеет простую реализацию словаря и имеет хорошую поддержку TypeScript
Установить Lodash:
npm install lodash @types/lodash --save
Импорт и использование:
import { Dictionary } from "lodash";
let properties : Dictionary<string> = {
"key": "value"
}
console.log(properties["key"])
Вы также можете использовать тип записи в машинописном тексте:
export interface nameInterface {
propName : Record<string, otherComplexInterface>
}
map
содержит два элемента: (& lt; any & gt; Object.prototype) .something = function () {}; class Customer {} var map: {[email: string]: Клиент; знак равно map ['foo@gmail.com '] = новый клиент (); для (var i на карте) {console.log (map [i])} – Ken Smith 30 November 2012 в 19:21var map:MapStringTo<Customer> = {};
– orellabac 24 August 2013 в 01:50