Выбор ответа Junior Утилитарные типы спрашивают часто обновлено

ReturnType и typeof

Вопрос

Почему строка не компилируется?

async function load(id: number) {
  return id * 2;
}
type R = ReturnType<load>;

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: load это значение, а ReturnType ждёт тип: нужен typeof load. Утилиты принимают типы, а load это функция-значение.

Варианты ответа

  1. load это значение, а ReturnType ждёт тип: нужен typeof loadправильный ответ
  2. Нужно указать аргументы вызова прямо в типе: ReturnType<load(1)>
  3. ReturnType устарел для промисов, вместо него нужен Awaited<load>
  4. ReturnType не работает с асинхронными функциями, только с обычными

Разбор

Утилиты принимают типы, а load это функция-значение. В позиции типа его нужно превратить в тип через typeof: ReturnType<typeof load> даёт Promise<number>, а Awaited<ReturnType<typeof load>> даёт number.

С асинхронными функциями ReturnType работает, просто возвращает промис. Вызов внутри типа не пишут. ReturnType не устарел, Awaited решает другую задачу.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.