← Назад ко всем вопросам

Как написать Generic, чтобы ограничить типы

1️⃣ Как кратко ответить

Generic в TypeScript можно ограничить с помощью ключевого слова extends, указывая, что параметр типа должен быть подтипом определенного типа. Это позволяет использовать только те типы, которые соответствуют указанным ограничениям.

2️⃣ Подробное объяснение темы

Generics в TypeScript позволяют создавать компоненты, которые работают с различными типами данных, обеспечивая при этом строгую типизацию. Однако иногда необходимо ограничить, какие типы могут быть использованы в качестве параметров типа. Это достигается с помощью ограничения типов (type constraints).

Зачем нужны ограничения типов

Ограничения типов позволяют:

  • Убедиться, что передаваемые типы имеют определенные свойства или методы.
  • Избежать ошибок, связанных с использованием неподходящих типов.
  • Улучшить автодополнение и проверку типов в редакторах кода.

Как это работает

Чтобы ограничить типы в Generic, используется ключевое слово extends. Оно указывает, что параметр типа должен быть подтипом определенного типа. Рассмотрим пример:

// Определяем интерфейс с обязательным свойством length
interface HasLength {
  length: number;
}
​
// Функция принимает массив элементов типа T, где T должен иметь свойство length
function logLength<T extends HasLength>(item: T): void {
  console.log(item.length);
}
​
// Пример использования с массивом (массивы имеют свойство length)
logLength([1, 2, 3]); // Вывод: 3
​
// Пример использования со строкой (строки имеют свойство length)
logLength("Hello"); // Вывод: 5
​
// Ошибка: число не имеет свойства length
// logLength(123); // Ошибка компиляции

Разбор примера

  1. Интерфейс HasLength:

    interface HasLength {
      length: number;
    }
    

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

  2. Функция logLength:

    function logLength<T extends HasLength>(item: T): void {
      console.log(item.length);
    }
    

    Функция logLength принимает параметр item типа T. Параметр типа T ограничен интерфейсом HasLength, что означает, что item должен иметь свойство length.

  3. Примеры использования:

    • logLength([1, 2, 3]); — массивы имеют свойство length, поэтому они соответствуют ограничению.
    • logLength("Hello"); — строки также имеют свойство length, поэтому они соответствуют ограничению.
    • logLength(123); — числа не имеют свойства length, поэтому использование числа вызовет ошибку компиляции.

Применение в реальных проектах

Ограничения типов полезны в ситуациях, когда необходимо работать с объектами, имеющими определенные свойства или методы. Например, при создании универсальных функций для работы с коллекциями данных, где требуется доступ к свойству length или другим специфическим свойствам. Это позволяет создавать более надежный и предсказуемый код, который легче поддерживать и расширять.

Тема: TypeScript
Стадия: Tech

🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!

Твои заметки