Biorąc pod uwagę następujący kod
interface IPerson {
firstName: string;
lastName: string;
}
var persons: { [id: string]: IPerson; } = {
"p1": { firstName: "F1", lastName: "L1" },
"p2": { firstName: "F2" }
};
Dlaczego inicjalizacja nie jest odrzucana? W końcu drugi obiekt nie ma właściwości „lastName”.
Index signatures are incompatible.
Type '{ firstName: string; }' is not assignable to type 'IPerson'.
Property 'lastName' is missing in type '{ firstName: string; }'.
Odpowiedzi:
Edycja : Zostało to naprawione w najnowszych wersjach TS. Cytując komentarz @ Simon_Weavera do posta PO:
Najwyraźniej nie działa to przy przekazywaniu początkowych danych w deklaracji. Sądzę, że jest to błąd w TypeScript, więc powinieneś go zgłosić na stronie projektu.
Możesz skorzystać ze słownika maszynowego, dzieląc przykład na deklarację i inicjalizację, na przykład:
źródło
id
symbolu? Wydaje się, że nie jest to konieczne.id
symbolu możesz zadeklarować, jaki powinien być typ kluczy słownika. W związku z powyższą deklaracją nie można wykonać następujących czynności:persons[1] = { firstName: 'F1', lastName: 'L1' }
id
symbol można nazwać coś cię jak zaprojektowana w taki sposób, aby ułatwić odczyt kodu. np.{ [username: string] : IPerson; }
Aby użyć obiektu słownika w maszynopisie, możesz użyć interfejsu jak poniżej:
i użyj tego dla swojego typu właściwości klasy.
użyć i zainicjować tę klasę,
źródło
Zgadzam się z Thomaux, że błąd sprawdzania typu inicjalizacji to błąd TypeScript. Nadal jednak chciałem znaleźć sposób na zadeklarowanie i zainicjowanie słownika w pojedynczej instrukcji z poprawnym sprawdzaniem typu. Ta implementacja jest dłuższa, ale dodaje dodatkowe funkcje, takie jak a
containsKey(key: string)
iremove(key: string)
metoda. Podejrzewam, że można to uprościć, gdy leki generyczne będą dostępne w wersji 0.9.Najpierw deklarujemy podstawową klasę Dictionary i interfejs. Interfejs jest wymagany dla modułu indeksującego, ponieważ klasy nie mogą ich zaimplementować.
Teraz deklarujemy typ osoby oraz interfejs Słownik / Słownik. W PersonDictionary zauważ, w jaki sposób zastępujemy
values()
i zwracamytoLookup()
prawidłowe typy.A oto prosty przykład inicjalizacji i użycia:
źródło
containsKey(key: string): bool;
nie działa z TypeScript 1.5.0-beta . Należy zmienić nacontainsKey(key: string): boolean;
.Oto bardziej ogólna implementacja słownika zainspirowana tym z @dmck
źródło
Jeśli chcesz zignorować właściwość, oznacz ją jako opcjonalną, dodając znak zapytania:
źródło
Teraz jest biblioteka, która zapewnia silnie typowane, kwerendowe kolekcje w maszynopisie.
Te kolekcje to:
Biblioteka nazywa się ts-generic-collections-linq .
Kod źródłowy na GitHub:
https://github.com/VeritasSoftware/ts-generic-collections
NPM:
https://www.npmjs.com/package/ts-generic-collections-linq
Za pomocą tej biblioteki możesz tworzyć kolekcje (jak
List<T>
) i wyszukiwać je, jak pokazano poniżej.źródło