Весной стартует сезон найма, успей отхватить свой оффер!

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

  1. Упрощение: Не нужно вручную объявлять или дублировать тип возвращаемого значения.
  2. Синхронизация: Если изменится логика функции createUser, ReturnType автоматически подстроится, исключая риск рассинхронизации.
  3. Гибкость: Удобно для фабрик (factory) или для «обёрток» (wrappers) над функциями, где нужно знать, что именно возвращает исходная функция.

Совместимость с другими утилитами

Иногда ReturnType комбинируют с InstanceType, Parameters или другими утилитами (например, для построения более сложных типов, зависящих от результатов функций).


Примечания:

  1. ReturnType не работает с некоторыми сценариями «сложных» overload-функций, когда у функции есть несколько вариантов перегрузки. В таких случаях TypeScript попытается вывести обобщённый или «склеенный» тип.
  2. Если функция использует generic-типы, ReturnType может потребовать более аккуратного подхода, чтобы учесть конкретную специализацию.

Итог

  • ReturnType упрощает процесс извлечения типа возвращаемого значения у функции, позволяя избежать дублирования и повышая согласованность кода.
  • Полезен, когда вы хотите максимально довериться механизму вывода типов TypeScript, сохранив связь между функциями и их потребителями.