Как создать универсальный условный тип в Typescript?

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

Для создания универсального условного типа в TypeScript можно использовать ключевое слово "extends". Например, предположим, что у нас есть функция, которая принимает аргумент и возвращает различные типы, в зависимости от значения этого аргумента:

function processValue<T extends string | number>(value: T): T extends string ? string : number {
  if (typeof value === 'string') {
    // обработка строки
    return value.toUpperCase() as T extends string ? string : number;
  } else {
    // обработка числа
    return Math.sqrt(value) as T extends string ? string : number;
  }
}

В этом примере у нас есть тип T, который должен быть либо string, либо number. Мы используем условный тип, чтобы определить, должен ли возвращаемый тип быть string или number, в зависимости от переменной T.

Например, если мы вызываем функцию processValue('hello'), она вернет значение 'HELLO' и тип string. Если мы вызываем функцию processValue(9), она вернет значение 3 и тип number.

Также возможно создание более сложных условных типов, используя предикаты на типах и операторы keyof или in. Например:

type IsString<T> = T extends string ? true : false;

type MyType<T> = IsString<T> extends true ? string : number;

В этом примере мы определяем тип IsString<T>, который проверяет является ли тип T строкой. Затем мы создаем тип MyType<T>, который определяет, какой тип должна вернуть функция в зависимости от типа T.

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