В 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 могут быть очень мощными инструментами, позволяющими задавать различные типы данных в зависимости от переменных или других типов данных. Они позволяют создавать более гибкий и динамичный код, который может автоматически выбирать правильные типы на основе ситуации.