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.
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.
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:
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.
W projekcie wszystkie klasy były deklarowane bez modyfikatorów dostępu i wyraźnych typów, aby przyspieszyć rozwój.
Plusy:
Minusy:
Wszystkie człony klasy są starannie typizowane, używane są private/protected/public, ścisła typizacja właściwości i metod.
Plusy:
Minusy: