Демистификация выбора типа в TypeScript: подробное руководство

В 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, чтобы еще больше улучшить свой опыт разработки. Приятного кодирования!