Использование типовых параметров в ограничениях дженериков в TypeScript
Также в TypeScript есть возможность объявления одного типового параметра, который будет ограничен другим типовым параметром. Это необходимо, когда приходится копировать свойства из одного объекта в другой, при этом застраховаться от того, что мы не передадим лишнее свойство.
Давайте рассмотрим следующий пример. Снова
вернемся к функция myFunc, определяющей
длину переменной:
function myFunc <T> (data: T): T {
console.log(data.length); // ошибка
return data;
}
Однако теперь мы хотим, чтобы данная функция
работала только с теми типами, у которых
есть свойство length. Для этого сделаем
интерфейс ILength, которому зададим
свойство length числового типа:
interface ILength {
length: number;
}
Далее в нашей функции зададим обобщенный
тип, который наследует от ILength
через ключевое слово extends:
function myFunc <T extends ILength> (data: T): T {
console.log(data.length);
return data;
}
Вот так выглядит наш полный код:
interface ILength {
length: number;
}
function myFunc <T extends ILength> (data: T): T {
console.log(data.length);
return data;
}
Давайте проверим работу нашей функции и найдем длину строки:
console.log(myFunc('abcde'));
Результат выполненного кода:
5
'abcde'
А теперь передадим в параметр массив:
console.log(myFunc(['a', 'b', 'c']));
Результат выполненного кода:
3
[ 'a', 'b', 'c' ]