Właściwość nigdy nie przypisana
Property 'x' has no initializer and is not definitely assigned in the constructor.Własne słowa kompilatora. Nietłumaczone — to ten ciąg, który wkleiłeś w wyszukiwarkę.
Klasa deklaruje właściwość, której nigdy nie nadano wartości, więc każda instancja startowałaby z `undefined` w miejscu, o którym typ mówi, że zawsze jest liczbą.
Odtworzenie
class C {
x: number
}Build potwierdza, że to emituje dokładnie ten kod.
Dlaczego kompilator tak mówi
To pochodzi z `strictPropertyInitialization` i zamyka dziurę istniejącą latami: zadeklarowanej właściwości wierzono na słowo. Kompilator przyjmie inicjalizator, pewne przypisanie w konstruktorze albo przyznanie, że właściwość jest opcjonalna — nie przyjmie typu obiecującego więcej, niż klasa potrafi dostarczyć.
Naprawy
- 01
class C { x = 0 }Zainicjuj ją w miejscu. Typ jest wywnioskowany z wartości, więc nie ma czego synchronizować.
- 02
class C { x: number constructor(x: number) { this.x = x } }Albo przypisz ją w konstruktorze, gdzie kompilator widzi, że każda ścieżka do niej dociera.
Wniosek
Modyfikator pewnego przypisania `!` też to ucisza i jest obietnicą, której kompilator nie sprawdzi. Sięgaj po niego tylko wtedy, gdy przypisania naprawdę dokonuje coś spoza klasy.