В TypeScript возможность извлекать определенные свойства из интерфейса, также известная как «выбор типа», — это мощная функция, позволяющая создавать новые типы на основе существующих. В этой статье будут рассмотрены различные методы выбора типов в TypeScript, а также приведены примеры кода.
Метод 1: использование типа утилиты Pick
Тип утилиты Pick в TypeScript позволяет извлекать определенные свойства из интерфейса и создавать новый тип, содержащий только эти свойства. Вот пример:
interface User {
id: number;
name: string;
email: string;
age: number;
}
type UserInfo = Pick<User, 'name' | 'email'>;
const user: UserInfo = {
name: 'John Doe',
email: 'johndoe@example.com',
};
В этом примере мы определяем интерфейс User
с несколькими свойствами. Затем мы используем служебный тип Pick
для создания нового типа UserInfo
, содержащего только свойства «имя» и «электронная почта» из интерфейса User
.
Метод 2: использование keyof и Pick
Другой подход — использовать оператор keyof
в сочетании с типом утилиты Pick
. Это позволяет динамически выбирать свойства на основе набора ключей. Вот пример:
interface Car {
make: string;
model: string;
year: number;
color: string;
}
function getCarInfo<T extends keyof Car>(car: Car, keys: T[]): Pick<Car, T> {
return keys.reduce((obj, key) => {
obj[key] = car[key];
return obj;
}, {} as Pick<Car, T>);
}
const car: Car = {
make: 'Toyota',
model: 'Camry',
year: 2022,
color: 'Silver',
};
const carInfo = getCarInfo(car, ['make', 'model']);
console.log(carInfo); // Output: { make: 'Toyota', model: 'Camry' }
В этом примере мы определяем интерфейс Car
и функцию getCarInfo
, которая принимает объект Car
и массив ключей. Функция использует keyof
, чтобы гарантировать, что переданные ключи являются действительными свойствами интерфейса Car
. Затем он использует служебный тип Pick
для создания нового типа, содержащего только указанные свойства.
Метод 3. Использование сопоставленных типов
Сопоставленные типы позволяют создавать новые типы путем преобразования каждого свойства существующего типа. Используя условные типы и keyof
, мы можем выборочно выбирать свойства интерфейса. Вот пример:
interface Product {
id: number;
name: string;
price: number;
description: string;
category: string;
}
type FilteredProduct<T> = {
[K in keyof T]: T[K] extends string ? T[K] : never;
};
type FilteredProductProperties = FilteredProduct<Product>;
const filteredProduct: FilteredProductProperties = {
id: 1,
name: 'Product 1',
description: 'This is product 1',
category: 'Category 1',
};
В этом примере мы определяем интерфейс Product
и создаем сопоставленный тип FilteredProduct
, который отфильтровывает нестроковые свойства. Результирующий тип FilteredProductProperties
содержит только свойства типа string
.
Выбор типа в TypeScript предоставляет гибкий способ извлечения определенных свойств из интерфейса и создания новых типов. В этой статье мы рассмотрели три метода: использование служебного типа Pick
, объединение keyof
и Pick
и использование сопоставленных типов. Поняв эти методы, вы сможете использовать всю мощь системы типов TypeScript и писать более выразительный и надежный код.
Не забудьте поэкспериментировать с этими методами в своих проектах и изучить дополнительные функции TypeScript, чтобы еще больше улучшить свой опыт разработки. Приятного кодирования!