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

+1 512новых вакансий за сутки·54 396вакансий открыто сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

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

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

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

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

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

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

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

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

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

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

Все подборки
  • Python8 752
  • Облачные технологии6 631
  • QA вакансии2 183
  • Android1 322
  • Инженер данных860
  • Продакт-менеджер316

Разработка

  • iOS1 238
  • Backend вакансии1 196
  • AI вакансии549
  • Fullstack вакансии500
  • Frontend вакансии426
  • Mobile вакансии28

По стеку

  • Go5 209
  • Java3 131
  • Kotlin1 113
  • Node.js1 008
  • Rust833
  • .NET656
  • PHP322
  • C++270
  • C#207

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

  • Kubernetes3 882
  • Linux-инфраструктура2 817
  • DevOps вакансии2 655
  • Terraform / IaC2 191
  • Мониторинг и Observability1 071
  • CI/CD919
  • SRE308
  • Кибербезопасность38

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

  • Аналитик данных522
  • Data Scientist435
  • Бизнес-аналитик397
  • Системный аналитик67

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

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

По регионам

  • Вакансии в США25 642
  • Вакансии в Европе10 259
  • Работа в России3 639
  • Вакансии в Канаде2 255

По формату

  • Удалённые вакансии42 339
  • Релокация в США25 642
  • Гибридная работа5 706
  • Офисная работа2 761

По уровню

  • Senior вакансии19 599
  • Middle вакансии11 130
  • Junior вакансии3 562

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

Все компании
  • Wise192 вакансии
  • Rakuten189 вакансий
  • ASML163 вакансии
  • Grab134 вакансии
  • Celonis42 вакансии
  • Spotify37 вакансий
  • Adyen28 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace17 вакансий

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

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

Что такое mapped types и как создать пользовательский mapped type?

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

Mapped type создаёт новый тип итерацией по ключам другого: { [K in keyof T]: ... }. Поддерживает модификаторы readonly/?, их удаление через минус, и переименование ключей через as с шаблонными литералами.

Базовый синтаксис

type Flags<T> = {
  [K in keyof T]: boolean;
};

interface User {
  id: number;
  name: string;
  email: string;
}

type UserFlags = Flags<User>;
// { id: boolean; name: boolean; email: boolean }

Что такое mapped types

Mapped type — это способ создать новый тип, итерируясь по ключам другого типа и трансформируя их. Синтаксис: { [K in SomeKeys]: TransformedType }. Это механизм, лежащий в основе большинства встроенных утилитарных типов TypeScript.

Модификаторы: readonly и ?

Знаки + и - добавляют или убирают модификаторы у каждого ключа:

// Добавить readonly (+ по умолчанию)
type Immutable<T> = {
  readonly [K in keyof T]: T[K];
};

// Убрать readonly
type Mutable<T> = {
  -readonly [K in keyof T]: T[K];
};

// Убрать опциональность (аналог Required)
type Concrete<T> = {
  [K in keyof T]-?: T[K];
};

Переименование ключей через as (remapping)

С TypeScript 4.1 можно переименовывать ключи с помощью as:

// Добавить префикс get к каждому ключу
type Getters<T> = {
  [K in keyof T as `get${Capitalize<string & K>}`]: () => T[K];
};

type UserGetters = Getters<User>;
// { getId: () => number; getName: () => string; getEmail: () => string }

// Отфильтровать ключи: remapping в never удаляет ключ
type OnlyStrings<T> = {
  [K in keyof T as T[K] extends string ? K : never]: T[K];
};

type StringUserFields = OnlyStrings<User>;
// { name: string; email: string }

Пользовательский mapped type: DeepReadonly

type DeepReadonly<T> = {
  readonly [K in keyof T]: T[K] extends object
    ? DeepReadonly<T[K]>
    : T[K];
};

interface Config {
  server: {
    host: string;
    port: number;
  };
  debug: boolean;
}

type ImmutableConfig = DeepReadonly<Config>;
// config.server.host — только для чтения на любой глубине

Mapped type по произвольному union

В качестве источника ключей можно использовать любой string/number literal union, не только keyof T:

type HttpMethods = "GET" | "POST" | "PUT" | "DELETE";

type MethodHandlers = {
  [M in HttpMethods]: (url: string, body?: unknown) => Promise<Response>;
};

const client: MethodHandlers = {
  GET:    (url) => fetch(url),
  POST:   (url, body) => fetch(url, { method: "POST", body: JSON.stringify(body) }),
  PUT:    (url, body) => fetch(url, { method: "PUT",  body: JSON.stringify(body) }),
  DELETE: (url) => fetch(url, { method: "DELETE" }),
};

Встроенные утилиты, реализованные через mapped types

  • Partial<T> — все поля опциональны
  • Required<T> — все поля обязательны
  • Readonly<T> — все поля только для чтения
  • Record<K, V> — объект с ключами K и значениями V
  • Pick<T, K> — подмножество полей
  • Omit<T, K> — исключение полей

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

  • Remapping ключа в never удаляет его из типа — полезно, но легко допустить ошибку в условии и потерять нужные поля.
  • Mapped types работают поверхностно по умолчанию: вложенные объекты не трансформируются автоматически, нужна явная рекурсия.
  • Рекурсивные mapped types могут вызвать ошибку «Type alias circularly references itself» — обходите через условный тип или interface.
  • При использовании Capitalize в as-remapping ключ должен быть string & K, а не просто K, иначе компилятор жалуется на символьные ключи.
  • Record<string, V> и mapped type по string — разные вещи по поведению с index signature; не всегда взаимозаменяемы.
  • Модификатор -? (убрать опциональность) не делает тип non-nullable — поля могут по-прежнему быть undefined, если это часть их типа.
  • Большие mapped types с ремаппингом замедляют автодополнение; разбивайте на промежуточные алиасы.

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

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

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

  • Объясняет преобразование свойств типа по ключам.
  • Показывает на примере, как работает: mapped type проходит по keyof исходного типа и создает новую объектную форму, при необходимости меняя optional, readonly или имена ключей.
  • Называет production-нюанс и граничный случай для темы «mapped types».

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

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

Источники

  • https://www.typescriptlang.org/docs/handbook/2/mapped-types.html
  • https://www.typescriptlang.org/docs/handbook/2/keyof-types.html
←Предыдущий вопросЧто такое оператор `satisfies` (представленный в TypeScript 4.9)?Следующий вопрос→Что такое `keyof` и как он используется?

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

TypeScripttype-level-programming

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

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)
  • React-разработчик микрофронтов
  • QA Automation Lead with AI Agent Testing experince

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

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