Utility Type ReturnType в TypeScript
ReturnType — это утилитный тип в TypeScript, который определяет, какой тип возвращает функция. Он помогает избежать дублирования и автоматически подстраивается, если функция меняется.
Синтаксис
ReturnType<T>
T
— это тип (или ссылка на саму функцию), из которой мы хотим получить тип возвращаемого значения.
TypeScript вычисляет тип, который функция фактически возвращает, и передаёт его на выход ReturnType
.
Пример использования
Извлечение типа возвращаемого значения функции
function createUser(name: string, age: number) {
return {
name,
age,
createdAt: new Date(),
};
}
type UserFromFunction = ReturnType<typeof createUser>;
- Функция
createUser
возвращает объект{ name, age, createdAt }
. ReturnType<typeof createUser>
извлекает точный тип этого объекта (например,{ name: string, age: number, createdAt: Date }
).
Типизация вспомогательных функций
Если у вас есть вспомогательные (helper) функции, которые обрабатывают результат из другой функции, можно напрямую использовать ReturnType
:
function processUserData(user: ReturnType<typeof createUser>) {
console.log(user.name, user.createdAt);
// ...
}
processUserData
будет получать объект с тем же типом, что возвращаетcreateUser
, обеспечивая связность и избежание дублирования типов.
Зачем нужен ReturnType
- Упрощение: Не нужно вручную объявлять или дублировать тип возвращаемого значения.
- Синхронизация: Если изменится логика функции
createUser
,ReturnType
автоматически подстроится, исключая риск рассинхронизации. - Гибкость: Удобно для фабрик (factory) или для «обёрток» (wrappers) над функциями, где нужно знать, что именно возвращает исходная функция.
Совместимость с другими утилитами
Иногда ReturnType
комбинируют с InstanceType
, Parameters
или другими утилитами (например, для построения более сложных типов, зависящих от результатов функций).
Примечания:
ReturnType
не работает с некоторыми сценариями «сложных» overload-функций, когда у функции есть несколько вариантов перегрузки. В таких случаях TypeScript попытается вывести обобщённый или «склеенный» тип.- Если функция использует generic-типы,
ReturnType
может потребовать более аккуратного подхода, чтобы учесть конкретную специализацию.
Итог
- ReturnType упрощает процесс извлечения типа возвращаемого значения у функции, позволяя избежать дублирования и повышая согласованность кода.
- Полезен, когда вы хотите максимально довериться механизму вывода типов TypeScript, сохранив связь между функциями и их потребителями.