Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про TypeScript: TypeScript, conditional types, key remapping, mapped types, template literals

Как получить ключи объекта по типу значений (например, только string)?

Проверяет понимание продвинутых типов TypeScript для фильтрации ключей объекта по типу их значений.

Короткий ответ

В TypeScript можно получить ключи объекта, значения которых имеют определённый тип, используя условные типы и key remapping. Создаётся тип, который перебирает ключи и проверяет, соответствует ли тип значения заданному. Если да — ключ остаётся, иначе — исключается. Это позволяет строго типизировать функции, работающие с подмножеством свойств объекта.

Длинный ответ

Концепция фильтрации ключей по типу значений

TypeScript предоставляет мощные инструменты для манипуляции типами на уровне системы типов. Одна из распространённых задач — получить только те ключи объекта, значения которых имеют определённый тип, например, только строки. Это достигается с помощью условных типов (conditional types) и синтаксиса key remapping в mapped types.

Как это работает

Основная идея заключается в создании типа, который перебирает все ключи исходного объекта и проверяет, является ли тип значения по данному ключу нужным. Если да — ключ включается в результат, иначе — отбрасывается. Для этого используется конструкция as в mapped type, которая позволяет преобразовывать ключи.

type KeysOfType<T, V> = {
  [K in keyof T as T[K] extends V ? K : never]: T[K]
} extends infer R ? keyof R : never;

// Пример использования
interface User {
  name: string;
  age: number;
  email: string;
  isAdmin: boolean;
}

type StringKeys = KeysOfType<User, string>; // "name" | "email"

В этом примере тип KeysOfType принимает два параметра: T — исходный объект, V — искомый тип значения. Внутри mapped type мы используем as для условного включения ключа: если T[K] extends V, то ключ остаётся, иначе — never. Затем мы приводим результат к типу и извлекаем его ключи с помощью keyof.

Практическое применение

Этот подход полезен при создании строго типизированных функций, которые работают только с определёнными свойствами объекта. Например, функция, которая извлекает все строковые значения из объекта:

function getStringValues<T extends Record<string, any>>(obj: T): Pick<T, KeysOfType<T, string>> {
  const result: any = {};
  for (const key in obj) {
    if (typeof obj[key] === 'string') {
      result[key] = obj[key];
    }
  }
  return result;
}

const user: User = { name: "Alice", age: 30, email: "alice@example.com", isAdmin: false };
const strings = getStringValues(user); // { name: "Alice", email: "alice@example.com" }

Тип возвращаемого значения гарантирует, что функция вернёт только те свойства, которые имеют строковый тип.

Вывод

Фильтрация ключей по типу значений — мощный инструмент TypeScript для создания типобезопасных утилит. Он особенно полезен при работе с динамическими данными, где требуется строгая проверка типов на уровне компиляции, что снижает вероятность ошибок во время выполнения.

Frontend developer

tech
tech
tech
tech
tech
tech
tech
tech
tech

Ментор по Frontend

Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства

Записаться на консультацию

Уровень

  • Рейтинг:

    4

  • Сложность:

    7

Навыки

  • TypeScript

    TypeScript

Ключевые слова

#TypeScript

#conditional types

#key remapping

#mapped types

#template literals

Подпишись на React Developer в телеграм

Frontend developer

tech
tech
tech
tech
tech
tech
tech
tech
tech

Ментор по Frontend

Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства

Записаться на консультацию