В чем разница между паттернами в TypeScript и в других языках?
Основы TypeScript
Паттерны проектирования в TypeScript те же, что и в других языках, но реализуются по-другому из-за структурной типизации и того, что типы стираются при компиляции.
Отличия
- Структурная типизация. Тип совместим, если у него подходящая форма, а не потому что он явно реализует интерфейс. Многие паттерны (стратегия, адаптер) сводятся к объекту с нужными функциями, без иерархии классов.
- Функции первого класса. Стратегию, команду, наблюдателя часто описывают функциями, а не классами.
type Strategy = (price: number) => number;
const discount: Strategy = (p) => p * 0.9;
function checkout(price: number, apply: Strategy) {
return apply(price);
}- Нет рантайм-типов. Нельзя выбрать реализацию по типу — нужен дискриминант (
kind: 'circle') или type guard. - Модули вместо синглтонов. Модуль ES уже единственный экземпляр.
- Дискриминированные объединения часто заменяют паттерн «посетитель» и наследование.
Коротко для собеседования
Паттерны те же, но TypeScript — структурный и мультипарадигменный: многое делают функциями, объединениями и модулями вместо иерархий классов; типов в рантайме нет.
Подробнее: Refactoring.Guru — паттерны на TypeScript