TypeScript: методы сужения объектов — подробное руководство

TypeScript, статически типизированная расширенная версия JavaScript, предлагает мощные инструменты для работы со сложными структурами данных. Одной из распространенных проблем является сужение объектов до определенных типов или подмножеств на основе определенных условий. В этой статье мы рассмотрим различные методы сужения объектов в TypeScript, а также приведем примеры кода. Эти методы помогут вам написать более надежный и безошибочный код.

  1. Защита типов.
    Защита типов — это фундаментальный механизм TypeScript для сужения типов объектов на основе проверок во время выполнения. Вы можете использовать предикаты typeof, instanceofили собственные типы для создания защиты типа. Вот пример:
interface Circle {
  kind: 'circle';
  radius: number;
}
interface Square {
  kind: 'square';
  sideLength: number;
}
function calculateArea(shape: Circle | Square): number {
  if (shape.kind === 'circle') {
    return Math.PI * shape.radius  2;
  } else if (shape.kind === 'square') {
    return shape.sideLength  2;
  }
  throw new Error('Invalid shape');
}
  1. Дискриминированные объединения.
    Дискриминированные объединения, также известные как теговые объединения или алгебраические типы данных, позволяют сузить типы объектов на основе дискриминантного свойства. Свойство дискриминанта — это литеральный тип, общий для всех объектов в объединении. Вот пример:
interface SuccessResponse {
  success: true;
  data: any;
}
interface ErrorResponse {
  success: false;
  error: string;
}
type APIResponse = SuccessResponse | ErrorResponse;
function handleResponse(response: APIResponse) {
  if (response.success) {
    console.log('Data:', response.data);
  } else {
    console.error('Error:', response.error);
  }
}
  1. Условные типы.
    Условные типы позволяют выполнять сужение типов на основе условных операторов. Вы можете использовать ключевое слово extends, чтобы определить ограничения типов и вывести результирующие типы. Вот пример:
type NonNullable<T> = T extends null | undefined ? never : T;
function processValue<T>(value: T): NonNullable<T> {
  if (value === null || value === undefined) {
    throw new Error('Value cannot be null or undefined');
  }
  return value;
}
  1. Пользовательские средства защиты типов.
    Вы можете создать свои собственные средства защиты типов, определив пользовательские функции, которые возвращают логическое значение. Эти функции выполняют проверки во время выполнения и соответствующим образом сужают типы объектов. Вот пример:
function isString(value: any): value is string {
  return typeof value === 'string';
}
function processInput(input: string | number) {
  if (isString(input)) {
    console.log(input.toUpperCase());
  } else {
    console.log(input * 2);
  }
}

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

Не забывайте использовать возможности статической проверки типов TypeScript, чтобы выявить любые потенциальные проблемы на ранних этапах процесса разработки. Приятного кодирования!