Проверяет понимание продвинутых типов TypeScript для фильтрации ключей объекта по типу их значений.
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
Ментор по Frontend
Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства
Записаться на консультацию