Типы классов и наследования были добавлены в TypeScript для поддержки объектно-ориентированных шаблонов, привычных по другим языкам (Java, C#). TypeScript позволяет создавать классы с явно заданными типами свойств и методов, а также реализовать наследование с типовой безопасностью.
Без явной типизации в JavaScript ошибки, связанные с неправильным использованием свойств, не обнаруживаются на этапе компиляции. Проблемы возникают при переопределении методов/свойств потомками, при нарушении контракта базового класса и неправильной работе с protected/private.
TypeScript позволяет использовать ключевые слова public, private, protected, явно указывать типы свойств и методов, наследовать классы с помощью extends и реализовывать интерфейсы.
Пример кода:
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.
Ключевые особенности:
Что будет, если не указать тип поля класса?
TypeScript попытается вывести тип по присваиваемому значению, если оно есть. Если нет — тип будет any, что снижает безопасность кода.
class Test { value; constructor(v: number) { this.value = v; } }
value будет типа any, если не задано значение по умолчанию — потенциальная брешь в типобезопасности.
Можно ли изменить модификатор доступа наследуемого метода?
Да, но только усилив его (например, с public на protected или private — нельзя), а вот с private на public нельзя, т.к. private-член не наследуется. Это приведёт к ошибке компиляции.
Можно ли наследоваться от нескольких классов в TypeScript?
Нет, множественное наследование классов запрещено. Можно реализовать несколько интерфейсов, но только один extends от класса.
В проекте все классы объявлялись без модификаторов доступа и явных типов, для ускорения разработки.
Плюсы:
Минусы:
Все члены класса тщательно типизированы, используются private/protected/public, строгая типизация свойств и методов.
Плюсы:
Минусы: