Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

+661новая вакансия за сутки·58 731вакансия открыта сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании5 712
РезюмеAIПодготовкаСтатьи
ТарифыТарифы
Войти

Не нашли подходящее?

Пусть нужная вакансия найдёт вас сама.

  1. Подборка в TelegramНовые вакансии по вашему фильтру — сразу в бота.Подключить
  2. Мэтчи по резюмеЗагрузите резюме — покажем, где вы подходите лучше всего.Загрузить
  3. Сохранить фильтрНастройте поиск один раз и возвращайтесь к новым вакансиям.Настроить
Что нового на TalantoTalanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Для работодателей

Опубликуйте вакансию — отклики придут в ваш кабинет.

  1. Вакансиябесплатно
  2. Откликиконтакты бесплатно
  3. Наймэтапы и интервью

40 компаний публикуют вакансии напрямую · 4 393 кандидата открыты к предложениям

Разместить вакансию

Популярные направления

Все подборки
  • Python11 079
  • Облачные технологии8 824
  • QA вакансии2 977
  • Android1 395
  • Инженер данных1 032
  • Продакт-менеджер351

Разработка

  • Backend вакансии1 342
  • iOS1 307
  • AI вакансии660
  • Fullstack вакансии524
  • Frontend вакансии465
  • Mobile вакансии28

По стеку

  • Go6 622
  • Java3 670
  • Kotlin1 199
  • Node.js1 190
  • Rust1 181
  • .NET780
  • PHP329
  • C++301
  • C#211

DevOps и инфраструктура

  • Kubernetes5 251
  • Linux-инфраструктура4 138
  • DevOps вакансии3 024
  • Terraform / IaC2 834
  • Мониторинг и Observability1 406
  • CI/CD917
  • SRE389
  • Кибербезопасность40

Аналитика и данные

  • Аналитик данных586
  • Бизнес-аналитик487
  • Data Scientist458
  • Системный аналитик75

Другие направления

  • Проджект-менеджер114
  • UI/UX дизайн74
  • Ручное тестирование14

По регионам

  • Вакансии в США31 201
  • Вакансии в Европе11 507
  • Работа в России3 630
  • Вакансии в Канаде2 546

По формату

  • Удалённые вакансии47 761
  • Релокация в США31 201
  • Гибридная работа7 699
  • Офисная работа6 071

По уровню

  • Senior вакансии27 027
  • Middle вакансии12 284
  • Junior вакансии4 495

Сейчас нанимают

Все компании
  • Wise196 вакансий
  • Rakuten188 вакансий
  • ASML163 вакансии
  • Grab134 вакансии
  • Celonis48 вакансий
  • Spotify38 вакансий
  • Adyen28 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace17 вакансий

Вакансии из 344 источников: карьерные страницы компаний и джоб-борды.

КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К теме TypeScriptВсе вопросы
TypeScriptMiddleТеория

Что такое утилитный тип Awaited<T>?

В закладки
Сначала попробуйте ответить сами30 секунд
Сравнить с ответом ↓

Awaited<T> рекурсивно разворачивает Promise: Awaited<Promise<Promise<string>>> → string. Используется для вывода типа результата async-функций и совместим с union-типами.

Базовые примеры

type A = Awaited<Promise<string>>;           // string
type B = Awaited<Promise<Promise<number>>>;  // number
type C = Awaited<boolean>;                    // boolean (не Promise — возвращается как есть)
type D = Awaited<Promise<string> | number>;  // string | number (union раскрывается поэлементно)

Что такое Awaited<T>

Awaited<T> — встроенный утилитный тип TypeScript (добавлен в 4.5), который рекурсивно разворачивает вложенные Promise и объекты с методом then, имитируя то, что происходит при await в рантайме. До его появления разработчики писали громоздкие условные типы вручную.

Алгоритм разворачивания:

  1. Если T — null или undefined, вернуть T как есть.
  2. Если T имеет метод then(onfulfilled) (то есть является thenable), взять тип первого аргумента onfulfilled и применить Awaited рекурсивно.
  3. Иначе вернуть T без изменений.

Реальный пример: типизация ответа API

// api.ts
export async function fetchUser(id: string) {
  const res = await fetch(`/api/users/${id}`);
  if (!res.ok) throw new Error(`HTTP ${res.status}`);
  return res.json() as Promise<{ id: string; name: string; role: "admin" | "user" }>;
}

// Автоматически выводим тип без дублирования интерфейса
type User = Awaited<ReturnType<typeof fetchUser>>;
// { id: string; name: string; role: "admin" | "user" }

// Теперь можно типизировать кэш, хранилище, пропсы компонента
const cache = new Map<string, User>();

async function getUser(id: string): Promise<User> {
  if (cache.has(id)) return cache.get(id)!;
  const user = await fetchUser(id);
  cache.set(id, user);
  return user;
}

Пример с Promise.all и union

async function loadDashboard() {
  return Promise.all([
    fetch("/api/user").then(r => r.json() as Promise<{ name: string }>),
    fetch("/api/stats").then(r => r.json() as Promise<{ count: number }>),
  ]);
}

// Тип результата Promise.all — кортеж, Awaited разворачивает каждый элемент
type DashboardData = Awaited<ReturnType<typeof loadDashboard>>;
// [{ name: string }, { count: number }]

// Используем в компоненте
function Dashboard({ data }: { data: DashboardData }) {
  const [user, stats] = data;
  return <div>{user.name}: {stats.count} jobs</div>;
}

Пример с обобщённым хелпером

// Универсальный retry-хелпер сохраняет тип через Awaited
async function withRetry<T>(
  fn: () => Promise<T>,
  attempts = 3
): Promise<T> {
  for (let i = 0; i < attempts; i++) {
    try {
      return await fn();
    } catch (err) {
      if (i === attempts - 1) throw err;
    }
  }
  throw new Error("unreachable");
}

// TypeScript правильно выводит тип без явного указания
const user = await withRetry(() => fetchUser("123"));
// user: { id: string; name: string; role: "admin" | "user" }

Подводные камни

  • Thenable ≠ Promise. Awaited раскрывает любой объект с методом then, не только нативный Promise. Если вы передаёте библиотечный объект-thenable (например, jQuery Deferred), результирующий тип может удивить.
  • Глубокая вложенность скрывает намерение. Awaited<Promise<Promise<T>>> === T, но такой тип — признак архитектурной проблемы (функция возвращает Promise от Promise). Компилятор не выдаёт предупреждений.
  • Не работает как замена infer внутри условных типов. Если вы пишете свой условный тип вроде type Unpack<T> = T extends Promise<infer U> ? U : T, он не рекурсивен. Используйте Awaited вместо него.
  • Потеря null/undefined из union. Awaited<Promise<string> | undefined> → string | undefined. Это корректно, но если ваш код предполагал проверку на undefined до await, тип всё равно позволит её пропустить.
  • Не работает с функциями-генераторами. AsyncGenerator — не thenable, его значения Awaited не раскрывает. Для генераторов используйте AsyncGenerator<T> напрямую.
  • Путаница с ReturnType синхронных функций. Если функция не async, но возвращает Promise явно, Awaited<ReturnType<typeof fn>> всё равно корректно раскроет тип. Проблемы нет, но разработчики иногда ошибочно думают, что Awaited применимо только к async-функциям.
  • Версия TypeScript. Awaited добавлен в 4.5. В монорепо со старыми пакетами, которые задают свои tsconfig с "target": "es5" и TS < 4.5, тип будет недоступен — это ломает сборку без очевидного сообщения об ошибке.

Частые вопросы на собеседовании

  • Что такое TypeScript и какие основные преимущества он даёт по сравнению с обычным JavaScript?
  • В чём разница между interface и псевдонимом типа (type) в TypeScript?
  • Что такое generics в TypeScript и зачем они нужны? Приведите пример.
  • Для каких задач TypeScript является сильным выбором, а где лучше честно выбрать другой язык?

Типичные ошибки

  • Смешивать «Awaited<T>» с похожим механизмом без критерия выбора.
  • Игнорировать риск: неверно оценить границы применения темы «Awaited<T>» и получить хрупкое решение.
  • Показывать только синтаксис и не объяснять поведение в runtime или сборке.

Что проверяет интервьюер

  • Объясняет моделирование результата await и рекурсивное разворачивание Promise.
  • Показывает на примере, как работает: Awaited корректно обрабатывает вложенные Promise и union, поэтому полезен для типов async-функций и библиотечных helpers.
  • Называет production-нюанс и граничный случай для темы «Awaited<T>».

Как вы знаете этот вопрос?

Проверить себя по теме TypeScript →

Источники

  • https://www.typescriptlang.org/docs/handbook/utility-types.html

Связанные темы

TypeScriptasync-programmingtype-modeling

Вакансии с этим навыком

TypeScript вакансии
  • AI Enablement Lead (GenAI Value Lab) (#5686)
  • Lead Fullstack Engineer (React+Next.js) (#5392)
  • Senior Python Engineer (with TypeScript and Agentic development experience) (#5874)
  • Software Engineer, Data Management Platform - Global Ad Technology Supervisory Department (GATD)
  • QA Manager - EC Expansion Development Department (ECEXD)