W klasach TypeScript można deklarować typy właściwości, na przykład:
class className {
property: string;
};
Jak zadeklarować typ właściwości w dosłowności obiektu?
Próbowałem następującego kodu, ale nie można go skompilować:
var obj = {
property: string;
};
Otrzymuję następujący błąd:
Nazwa „string” nie istnieje w bieżącym zakresie
Czy robię coś źle, czy to błąd?
typescript
Dace Zarina
źródło
źródło
Aktualizacja 2019-05-15 (ulepszony wzorzec kodu jako alternatywa)
Po wielu latach używania
const
i korzystania z bardziej funkcjonalnego kodu, w większości przypadków odradzam korzystanie z poniższych. (Podczas budowania obiektów zmuszanie systemu typów do określonego typu zamiast pozwalania mu na wnioskowanie o typach często oznacza, że coś jest nie tak).Zamiast tego zaleciłbym użycie
const
zmiennych w jak największym stopniu, a następnie skomponowanie obiektu jako ostatni krok:Dodanie 2020-02-26
Jeśli rzeczywiście potrzebujesz typu, który możesz leniwie zainicjować: Zaznacz, że jest to typ unii zerowej (null lub Type). System typów uniemożliwi korzystanie z niego bez uprzedniego upewnienia się, że ma wartość.
W
tsconfig.json
upewnij się, że włączono ścisłe kontrole zerowe:"strictNullChecks": true
Następnie użyj tego wzorca i pozwól systemowi typów zabezpieczyć cię przed przypadkowym zerowym / niezdefiniowanym dostępem:
Nie wykonuj poniższych czynności w 99% przypadków:
Aktualizacja 2016-02-10 - Aby obsłużyć TSX (Dzięki @Josh)
Użyj
as
operatora dla TSX.Dłuższy przykład:
Oryginalna odpowiedź
Użyj operatora rzutowania, aby uczynić to zwięzłym (przez ustawienie wartości null na żądany typ).
Dłuższy przykład:
Jest to o wiele lepsze niż posiadanie dwóch części (jedna do deklarowania typów, druga do deklarowania wartości domyślnych):
źródło
property: null as string
którym istotną różnicą jestas
operator.call
do drugiego przykładu możesz przypisać jej zupełnie inny typ?Error:(33, 15) TS2352:Type 'null' cannot be converted to type 'string'.
Dziwi mnie, że nikt o tym nie wspominał, ale można po prostu stworzyć interfejs o nazwie
ObjectLiteral
, który akceptujekey: value
pary typustring: any
:Wtedy użyjesz go w następujący sposób:
Dodatkową zaletą jest to, że możesz ponownie używać tego interfejsu tyle razy, ile potrzebujesz, na dowolnej liczbie obiektów.
Powodzenia.
źródło
[key: string]
części, a nie żadnej części jako definicji typu wartości ... To by rzeczywiście wydobyło użyteczność typów.Jeśli próbujesz napisać adnotację typu, składnia jest następująca:
Jeśli próbujesz napisać literał obiektu, składnia jest następująca:
Twój kod próbuje użyć nazwy typu w pozycji wartości.
źródło
var x: { property: string; } = ...;
złośliwiec! Miałem nadzieję, że elipsa była poprawną składnią, której należy użyćvar x: { property: string; } = { property: 'hello' };
.W TypeScript, jeśli deklarujemy obiekt, zastosowalibyśmy następującą składnię:
Na przykład:
źródło
Jeśli próbujesz dodać pisma do zniszczonego literału obiektu, na przykład w argumentach funkcji, składnia jest następująca:
źródło
Jeśli twoje właściwości mają ten sam typ, możesz użyć predefiniowanego typu narzędzia
Record
:Możesz oczywiście pójść dalej i zdefiniować niestandardowy typ dla swoich wartości właściwości:
źródło
let
zamiastvar
tutaj.źródło
W twoim kodzie:
W rzeczywistości tworzysz literał obiektu i przypisujesz ciąg zmiennej do właściwości myProp. Chociaż bardzo zła praktyka, tak naprawdę byłby to prawidłowy kod TS (nie używaj tego!):
Jednak chcesz, aby literał obiektu był wpisany. Można to osiągnąć na różne sposoby:
Berło:
Typ niestandardowy:
Operator obsady:
Literał typu obiektu:
źródło