@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
.