Как задать условный дженерик, для входящих в функцию параметров?

В TypeScript можно задавать условные дженерики для входящих параметров функции с использованием так называемых условных типов (conditional types). Условные типы позволяют нам определить тип в зависимости от условия, которое задается условием типа.

Для создания условного дженерика необходимо использовать ключевое слово "extends".
Вот пример:

function foo<T extends string | number>(param: T): T {
  return param;
}

В этом примере мы объявляем функцию foo, которая принимает параметр param с типом T. Здесь T обобщенный тип, который может быть либо string, либо number.

Функция возвращает тот же самый тип T, который был передан параметру param. Таким образом, если мы передаем строковый аргумент, функция вернет строковое значение, а если мы передаем числовой аргумент, функция вернет числовое значение.

Мы можем использовать такой условный дженерик для обеспечения типизации внутри функции в зависимости от типа параметра:

function bar<T extends string | number>(param: T): void {
  if (typeof param === 'string') {
    console.log(param.length);
  } else if (typeof param === 'number') {
    console.log(param.toFixed(2));
  }
}

В этом примере функция bar принимает параметр param с типом T, который может быть string или number. В функции мы проверяем тип param с помощью оператора typeof и выполняем различные операции в зависимости от типа.

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