programowanieFrontend developer

Jak działa typizacja klas i dziedziczenie w TypeScript? Jakie są cechy deklaracji właściwości i metod, jakie problemy mogą się przy tym pojawić i jak je rozwiązać?

Zdaj rozmowy kwalifikacyjne z asystentem AI Hintsage

Odpowiedź.

Historia pytania

Typy klas i dziedziczenia zostały dodane do TypeScript, aby wspierać wzorce programowania obiektowego znane z innych języków (Java, C#). TypeScript pozwala tworzyć klasy z wyraźnie określonymi typami właściwości i metod oraz realizować dziedziczenie z bezpieczeństwem typów.

Problem

Bez wyraźnej typizacji w JavaScript błędy związane z niewłaściwym użyciem właściwości nie są wykrywane na etapie kompilacji. Problemy pojawiają się przy nadpisywaniu metod/właściwości przez potomków, przy naruszeniu kontraktu klasy bazowej oraz niewłaściwej pracy z protected/private.

Rozwiązanie

TypeScript pozwala używać słów kluczowych public, private, protected, wyraźnie określać typy właściwości i metod, dziedziczyć klasy za pomocą extends oraz implementować interfejsy.

Przykład kodu:

class Animal { public name: string; protected age: number; private secret: string = "hidden"; constructor(name: string, age: number) { this.name = name; this.age = age; } speak(): void { console.log(`${this.name} makes a sound.`); } } class Dog extends Animal { constructor(name: string, age: number) { super(name, age); } speak(): void { console.log(`${this.name} barks.`); } } const dog = new Dog("Rex", 4); dog.speak(); // Rex barks.

Kluczowe cechy:

  • Wyraźne określenie typów właściwości i metod klasy
  • Użycie modyfikatorów dostępu do enkapsulacji
  • Wsparcie dla dziedziczenia i nadpisywania metod z kontrolą typów

Podchwytliwe pytania.

Co się stanie, jeśli nie określisz typu pola klasy?

TypeScript spróbuje wywnioskować typ na podstawie przypisywanej wartości, jeśli ta jest obecna. Jeśli nie — typ będzie any, co obniża bezpieczeństwo kodu.

class Test { value; constructor(v: number) { this.value = v; } }

value będzie miało typ any, jeśli nie przypisano wartości domyślnej — potencjalna luka w bezpieczeństwie typów.

Czy można zmienić modyfikator dostępu dziedziczonej metody?

Tak, ale tylko na bardziej restrykcyjny (np. z public na protected lub private — nie można), a z private na public nie można, ponieważ człon private nie jest dziedziczony. Spowoduje to błąd kompilacji.

Czy można dziedziczyć z wielu klas w TypeScript?

Nie, wielokrotne dziedziczenie klas jest zabronione. Można zaimplementować wiele interfejsów, ale tylko jedną klasę dziedziczącą za pomocą extends.

Typowe błędy i antywzorce

  • Nieokreślenie typów właściwości prowadzi do implicit any
  • Niewłaściwe nadpisywanie metod (z niezgodnymi sygnaturami)
  • Naruszanie enkapsulacji (otwieranie prywatnych właściwości)

Przykład z życia

Negatywny przypadek

W projekcie wszystkie klasy były deklarowane bez modyfikatorów dostępu i wyraźnych typów, aby przyspieszyć rozwój.

Plusy:

  • Szybkie wstępne prototypowanie

Minusy:

  • Trudno śledzić błędy dostępu
  • Częste błędy spowodowane niezamierzonym nadpisywaniem właściwości

Pozytywny przypadek

Wszystkie człony klasy są starannie typizowane, używane są private/protected/public, ścisła typizacja właściwości i metod.

Plusy:

  • Zapobieganie błędom na etapie kompilacji
  • Jasna architektura, łatwo zrozumieć strukturę obiektów

Minusy:

  • Wymaga więcej czasu na projektowanie, mniej elastyczności w eksperymentalnych zadaniach