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
- 01
interface I { m(): string } class K implements I { m(): string { return 'ok' } }
Dopasuj się do bazy.
- 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.