Каким образом можно использовать условные типы (conditional types) в TypeScript?
@colleen
Условные типы в TypeScript позволяют создавать типы, которые зависят от условия. Для определения условных типов используется ключевое слово infer.
Одним из примеров использования условных типов является определение типа значения, которое будет возвращено функцией, если ее вызов выполнится успешно:
1 2 3 4 5 6 7 |
type ReturnType = T extends (...args: any[]) => infer R ? R : any; function foo(): string { return 'Hello, world!'; } type FooReturn = ReturnType; // FooReturn === string |
В этом примере тип FooReturn определяется с помощью условного типа ReturnType. Если тип T является функцией с аргументами типа any[], то условие T extends (...args: any[]) => infer R будет истинным. Тогда тип R будет присвоен типу FooReturn.
Кроме того, условные типы могут использоваться при создании универсальных типов, которые зависят от типов других переменных:
1 2 3 4 5 6 |
type Value = T extends { value: infer V } ? V : never; type Item = { value: string }; const item: Item = { value: 'Hello, world!' }; const example: Value = 'Hello, world!'; // example === string |
Здесь тип Value зависит от типа переменной T. Если тип T имеет свойство value с типом V, то тип V будет присвоен типу Value<T>. В примере переменная example имеет тип string, потому что тип переменной item имеет свойство value с типом string.