Использование типовых параметров в ограничениях дженериков в TypeScript

Также в TypeScript есть возможность объявления одного типового параметра, который будет ограничен другим типовым параметром. Это необходимо, когда приходится копировать свойства из одного объекта в другой, при этом застраховаться от того, что мы не передадим лишнее свойство.

Давайте рассмотрим следующий пример. Снова вернемся к функция myFunc, определяющей длину переменной:

typescriptfunction myFunc <T> (data: T): T {
  console.log(data.length); // ошибка
  return data;
}

Однако теперь мы хотим, чтобы данная функция работала только с теми типами, у которых есть свойство length. Для этого сделаем интерфейс ILength, которому зададим свойство length числового типа:

typescriptinterface ILength {
  length: number;
}

Далее в нашей функции зададим обобщенный тип, который наследует от ILength через ключевое слово extends:

typescriptfunction myFunc <T extends ILength> (data: T): T {
  console.log(data.length);
  return data;
}

Вот так выглядит наш полный код:

typescriptinterface ILength {
  length: number;
}

function myFunc <T extends ILength> (data: T): T {
  console.log(data.length);
  return data;
}

Давайте проверим работу нашей функции и найдем длину строки:

typescriptconsole.log(myFunc('abcde'));

Результат выполненного кода:

typescript5
'abcde'

А теперь передадим в параметр массив:

typescriptconsole.log(myFunc(['a', 'b', 'c']));

Результат выполненного кода:

typescript3
[ 'a', 'b', 'c' ]