Infer
Infer для многих конструкция поистине инфернальная.
Infer объявляет переменную типа, в которую тип будет выведен позже. Чтобы понять, как работать с infer, нужно учесть, что он выводит тип исходя из соответствия шаблону. Поэтому в большинстве случаев нужно написать шаблон, куда вы подставите infer вместо интересующего вас типа.
Например, вы хотите вывести тип результата функции. Для примера возьмем функцию без аргументов, чтобы они нас не путали, они нам сейчас не нужны. Такой тип может быть описан вот так: () => number. Или так: () => { x: string }. Мы не знаем, что вернется из функции, и нас именно это как раз и интересует. Поэтому получается () => infer U (1️⃣). Вот этот U нам и нужен и как результат type alias (2️⃣).
Далее наш шаблон, который мы получили на шаге 1️⃣, мы подставляем после extends, а в true кейс подставляем желаемый результат, который мы получили на шаге 2️⃣. Получается
type ReturnType = T extends () => infer R ? R :
Надо что-то записать в false-кейс, это будет тип, который мы получаем, если параметр типа не будет соответствовать нашему условию. Нам не сильно интересен этот тип, нам интересны только те, которые соответствуют нашему условию. Поэтому здесь используем never. Итого получаем
type ReturnType = T extends () => infer R ? R : never;
#typescript
Infer для многих конструкция поистине инфернальная.
Infer объявляет переменную типа, в которую тип будет выведен позже. Чтобы понять, как работать с infer, нужно учесть, что он выводит тип исходя из соответствия шаблону. Поэтому в большинстве случаев нужно написать шаблон, куда вы подставите infer вместо интересующего вас типа.
Например, вы хотите вывести тип результата функции. Для примера возьмем функцию без аргументов, чтобы они нас не путали, они нам сейчас не нужны. Такой тип может быть описан вот так: () => number. Или так: () => { x: string }. Мы не знаем, что вернется из функции, и нас именно это как раз и интересует. Поэтому получается () => infer U (1️⃣). Вот этот U нам и нужен и как результат type alias (2️⃣).
Далее наш шаблон, который мы получили на шаге 1️⃣, мы подставляем после extends, а в true кейс подставляем желаемый результат, который мы получили на шаге 2️⃣. Получается
type ReturnType = T extends () => infer R ? R :
Надо что-то записать в false-кейс, это будет тип, который мы получаем, если параметр типа не будет соответствовать нашему условию. Нам не сильно интересен этот тип, нам интересны только те, которые соответствуют нашему условию. Поэтому здесь используем never. Итого получаем
type ReturnType = T extends () => infer R ? R : never;
#typescript