Przejdź do treści

    ↑↓ ruch · ⏎ otwórz · esc zamknij

    TS2564

    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

    1. 01
      class C {
        x = 0
      }

      Zainicjuj ją w miejscu. Typ jest wywnioskowany z wartości, więc nie ma czego synchronizować.

    2. 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.

    Błędy