Mam kod JavaScript, który używa obiektów jako słowników; na przykład obiekt „osoba” będzie przechowywał niektóre dane osobowe zapisane poza adresem e-mail.
var people = {<email> : <'some personal data'>};
adding > "people[<email>] = <data>;"
getting > "var data = people[<email>];"
deleting > "delete people[<email>];"
Czy można to opisać w maszynopisie? czy muszę użyć tablicy?
arrays
object
dictionary
typescript
Robert Taylor
źródło
źródło
Odpowiedzi:
W nowszych wersjach maszynopisu możesz użyć:
W starszych wersjach możesz użyć:
Możesz także utworzyć interfejs, jeśli nie chcesz za każdym razem wpisywać adnotacji tego typu:
źródło
map
zawiera dwa elementy: (<any> Object.prototype) .something = function () {}; klasa Klient {} var map: {[email: string]: Klient; } = {}; map ['[email protected]'] = nowy klient (); for (var i in map) {console.log (map [i])}var map:MapStringTo<Customer> = {};
Oprócz korzystania z obiektu podobnego do mapy , od pewnego czasu istnieje już rzeczywisty
Map
obiekt , który jest dostępny w TypeScript podczas kompilacji do ES6 lub podczas korzystania z funkcji wypełniania z definicjami typów ES6 :Obsługuje tę samą funkcjonalność co
Object
i więcej, z nieco inną składnią:Samo to ma kilka zalet w porównaniu z użyciem obiektu podobnego do mapy , takiego jak:
Object
(nie,Object
nie obsługuje liczb, konwertuje je na ciągi znaków)--noImplicitAny
, ponieważMap
zawsze ma typ klucza i typ wartości , podczas gdy obiekt może nie mieć podpisu indeksuObject
Ponadto
Map
obiekt zapewnia bardziej wydajny i elegancki interfejs API do typowych zadań, z których większość nie jest dostępna za pomocą prostychObject
s bez hakowania razem funkcji pomocniczych (chociaż niektóre z nich wymagają pełnego iteratora / wielokrotnego wypełniania ES6 dla celów ES5 lub niższych):źródło
JSON.stringify()
, więc można go użyć np. Do socket.io :(Map
serializacja jest raczej zabawna. Ja, na przykład, wykonuję konwersję do obiektów pary klucz-wartość przed serializacją, a następnie z powrotem (np. Obiekt{ key: "John", value: { firstName: "John" } }
).Możesz użyć takich szablonów:
źródło
let dict: Dictionary<number> = { "one": 1, "two": 2 };
Możesz także użyć typu Record w maszynopisie:
źródło
Lodash ma prostą implementację słownika i ma dobrą obsługę TypeScript
Zainstaluj Lodash:
Import i użycie:
źródło
Możesz użyć
Record
do tego:https://www.typescriptlang.org/docs/handbook/utility-types.html#recordkt
Przykład (odwzorowanie między wyliczeniem AppointmentStatus a niektórymi metadanymi):
Teraz z interfejsem jako wartością:
interface Icon { Name: string Color: string }
Stosowanie:
const icon: SemanticIcon = iconMapping[appointment.Status]
źródło
enum
lubclass/object
forAppointmentStatus
- czy to ma znaczenie?Istnieje biblioteka, która zapewnia silnie typowe, możliwe do zapytania zbiory w maszynopisie.
Kolekcje są:
Biblioteka nosi nazwę ts-generic-collections . ( Kod źródłowy na GitHub )
Możesz stworzyć słownik i zapytać go jak poniżej:
źródło