Подписаться
Опубликовано

Типы и интерфейсы. Часть 3

Автор
  • Имя
    Счастливый тимлид | ♥ Frontend
    Telegram

Типы и интерфейсы. Часть 3

Раз уж мы заговорили про классы, то давайте проясним и связанные с ними моменты.

Исторически так сложилось, что классы имплементируют, то есть реализуют, интерфейсы. Интерфейс является описанием, которому экземпляры класса должны соответствовать.

Сразу приведу пример: У нас есть уже наш давний знакомый интерфейс AInt, и его может имплементировать класс CClass. Выглядеть будет вот так:

typescript
// Описываем интерфейс interface AInt { first: boolean; second: number; }
typescript
// Имплементируем class CClass implements AInt { first = true; second = 20; }
typescript
// Создаем экземпляр const x = new CClass(); console.log(x.first); // true

А теперь интересно, сможем ли мы создать объект с другими значениями, ведь мы зафиксировали конкретные значения first и second в конструкторе. Пробуем:

typescript
const a: CClass = { first: false; second: 15; }
typescript
const b: AInt = { first: false; second: 15; }

Да, все получилось! Класс в этом случае ведет себя так же как и интерфейс. Результаты идентичны.

А как поживает наш type? Думаю вы уже догадались. TypeScript настолько не различает type и interface, что готов имплементировать и type тоже.

typescript
// Описываем тип type AType { first: boolean; second: number; }
typescript
// Имплементируем class CClass implements AType { first = true; second = 20; }
typescript
// Создаем экземпляр const x = new CClass(); console.log(x.first); // true

Более того, чтобы показать что TypeScript не видит разницы не только в типах и интерфейсах, но и в классах я воспользуюсь в качестве основы уже знакомым нам классом AClass:

typescript
// Описываем тип class AClass { public first: boolean; public second: number;
typescript
constructor(x: boolean, y: number) { this.first = x; this.second = y; } }
typescript
// Имплементируем class CClass implements AClass { first = true; second = 20; }
typescript
// Создаем экземпляр const x = new CClass(); console.log(x.first); // true

И здесь еще хочется добавить про расширение. Классы тоже умеют расширять типы, интерфейсы и другие классы. И да, у них тоже особенный синтаксис. Вот так можно добавить третье поле к AInt с помощью класса:

typescript
class BClass implements AInt { public third: string;
typescript
constructor() { this.first = true; this.second = 1; this.third = 'Hello'; } }

Расширять, как вы поняли, можно так же и type, и class. Но это уже сами 🙂

© Записки тимлида

Счастливый тимлид | ♥ Frontend
2204 подписчика
692 поста

Закрепленные

Из подборки #frontend

Опубликовано

Телеграмовский сосун (или какун, как правильно?)

Телеграмовский сосун суммирует мой лонгрид – стоит ли публиковать полную версию?
Опубликовано

Итоги

Итоги года блога тимлида: количество подписчиков, менторство, сообщество ИТ‑блогеров, планы на 2025
Опубликовано

Поделитесь вашими любимыми мемами уходящего года

Поделитесь любимыми мемами уходящего года

Свежие посты

Опубликовано

Телеграмовский сосун (или какун, как правильно?)

Телеграмовский сосун суммирует мой лонгрид – стоит ли публиковать полную версию?