Przejdź do treści

    ↑↓ ruch · ⏎ otwórz · esc zamknij

    TS2416

    Składowa nie zgadza się z bazą

    Property 'm' in type 'K' is not assignable to the same property in base type 'I'.…

    Własne słowa kompilatora. Nietłumaczone — to ten ciąg, który wkleiłeś w wyszukiwarkę.

    Składowa istnieje, dlatego to nie TS2420 — ale jej typ nie jest zgodny z tym, który zadeklarowała baza.

    Odtworzenie

    interface I {
      m(): string
    }
    
    class K implements I {
      m(): number {
        return 1
      }
    }

    Build potwierdza, że to emituje dokładnie ten kod.

    Dlaczego kompilator tak mówi

    Podtyp może obiecać *więcej* niż jego baza, nigdy mniej ani co innego. Zwrócenie węższego typu niż deklarowała baza jest w porządku; zwrócenie niepowiązanego psuje każdego wołającego napisanego pod interfejs. Zagnieżdżony szczegół pod tym komunikatem to miejsce z prawdziwą informacją — nazywa oba typy składowej i kierunek, w którym przypisanie zawiodło.

    Naprawy

    1. 01
      interface I {
        m(): string
      }
      
      class K implements I {
        m(): string {
          return 'ok'
        }
      }

      Dopasuj się do bazy.

    2. 02
      interface I {
        m(): string | number
      }
      
      class K implements I {
        m(): number {
          return 1
        }
      }

      Albo poszerz bazę, by węższa składowa była legalną specjalizacją. Teraz `number` da się przypisać do tego, co obiecał `I`, a wołający zostali uprzedzeni, by spodziewać się obu.

    Wniosek

    Zastępowalność działa w jedną stronę. Wszędzie tam, gdzie oczekiwana jest baza, podtyp musi pasować, a „pasuje” rozstrzygają te same reguły przypisywalności co wszędzie.

    Błędy