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

+1 199новых вакансий за сутки·93 838вакансий открыто сейчас·Новое:Talanto осенью: фильтры с числами, отклик по шагам и каталог компаний

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

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

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

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

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

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

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

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

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

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

Все подборки
  • Python17 222
  • Облачные технологии14 171
  • QA вакансии3 463
  • Backend вакансии2 114
  • Инженер данных1 801
  • Продакт-менеджер1 248

Разработка

  • Android1 858
  • iOS1 698
  • Fullstack вакансии997
  • AI вакансии955
  • Frontend вакансии755
  • Mobile вакансии44

По стеку

  • Go8 752
  • Java6 593
  • Node.js2 036
  • .NET1 739
  • Kotlin1 618
  • Rust1 472
  • C#717
  • PHP690
  • C++579

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

  • Kubernetes7 787
  • DevOps вакансии6 095
  • Linux-инфраструктура5 508
  • Terraform / IaC4 287
  • CI/CD3 272
  • Мониторинг и Observability1 792
  • SRE566
  • Кибербезопасность454

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

  • Data Scientist1 138
  • Бизнес-аналитик921
  • Аналитик данных858
  • Системный аналитик154

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

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

По регионам

  • Вакансии в США44 166
  • Вакансии в Европе24 014
  • Вакансии в Канаде4 535
  • Работа в России3 867

По формату

  • Удалённые вакансии75 005
  • Релокация в США44 166
  • Гибридная работа12 485
  • Офисная работа7 090

По уровню

  • Senior вакансии42 643
  • Middle вакансии20 963
  • Junior вакансии6 708

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

Все компании
  • Wise190 вакансий
  • Rakuten189 вакансий
  • ASML166 вакансий
  • Grab137 вакансий
  • Celonis38 вакансий
  • Spotify37 вакансий
  • Adyen29 вакансий
  • 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 вакансии
  • Staff Frontend Engineer (React)
  • Fullstack Developer (Java Core & React)
  • Summer 2027 Quality Engineering Internship
  • Data Analytics Developer
  • Sr Software Engineer - Remote

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

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