0Pricing
TypeScript Academy · Урок

Сужение типов с помощью instanceof и in

Сужайте типы экземпляров классов и структур объектов

«Сужение типов с помощью instanceof и in» — бесплатный урок TypeScript Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения TypeScript Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс TypeScript Academy содержит 4 уроков всего.

Добро пожаловать

`instanceof` сужает тип экземпляров классов, а `in` сужает типы объектов на основе наличия свойств. Оба оператора необходимы для работы со сложными объединениями.

Сужение с помощью instanceof

Используйте `instanceof`, чтобы проверить, является ли значение экземпляром класса. TypeScript сузит тип до этого класса.
function handle(err: Error | string) {
  if (err instanceof Error) {
    console.log(err.message); // err: Error
  } else {
    console.log(err); // err: string
  }
}

instanceof с пользовательскими классами

instanceof работает и с вашими собственными классами.
class Dog { bark() { return 'Woof'; } }
class Cat { meow() { return 'Meow'; } }
function speak(pet: Dog | Cat) {
  if (pet instanceof Dog) pet.bark();
  else pet.meow();
}

instanceof не работает с интерфейсами

Интерфейсы удаляются во время выполнения. Нельзя использовать instanceof с интерфейсом — только с классами.

Оператор in

Используйте `in`, чтобы проверить наличие свойства в объекте. TypeScript сужает объединение до вариантов, у которых есть это свойство.
type Fish = { swim(): void };
type Bird = { fly(): void };
function move(animal: Fish | Bird) {
  if ('swim' in animal) animal.swim();
  else animal.fly();
}

Сужение с помощью in для необязательных свойств

`in` также выполняет сужение для необязательных свойств — до вариантов объединения, в которых свойство CAN существовать.
type A = { x?: number };
type B = { y: number };
function process(v: A | B) {
  if ('x' in v) {
    // v: A (has optional x)
  }
}

Сочетание instanceof и in

Вы можете сочетать оба метода сужения для сложного различения типов.
function describe(v: Error | { message: string }) {
  if (v instanceof Error) console.log('Error:', v.stack);
  else if ('message' in v) console.log('Object:', v.message);
}

Использование in для дискриминируемых объединений

Если у вариантов объединения нет дискриминатора, проверки с помощью `in` могут выполнять ту же функцию сужения.
type Square = { side: number };
type Circle = { radius: number };
function area(s: Square | Circle): number {
  return 'side' in s ? s.side ** 2 : Math.PI * s.radius ** 2;
}

instanceof в блоках catch

Используйте instanceof в блоках catch, чтобы различать типы ошибок.
try {
  await fetchData();
} catch (err) {
  if (err instanceof NetworkError) { /* retry */ }
  else if (err instanceof AuthError) { /* redirect */ }
  else throw err;
}

Проверка Object.prototype по сравнению с in

И `key in obj`, и `Object.prototype.hasOwnProperty.call(obj, key)` проверяют наличие свойства, но `in` также находит унаследованные свойства.

Приоритет сужения

Если применимы несколько проверок сужения, TypeScript пересекает суженные типы, получая наиболее конкретный возможный тип.

Быстрая проверка

Почему в TypeScript нельзя использовать `instanceof` для сужения типа интерфейса?

Повторение

`instanceof` сужает экземпляры классов во время выполнения. `in` сужает объединения объектов на основе наличия свойств. Используйте оба оператора при работе с иерархиями классов и структурными объединениями объектов.

Часто задаваемые вопросы

Урок «Сужение типов с помощью instanceof и in» бесплатный?

Да — полный текст урока «Сужение типов с помощью instanceof и in» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс TypeScript Academy, подпишись на CoddyKit PRO. Курс TypeScript Academy содержит 4 уроков всего.

Чему я научусь в уроке «Сужение типов с помощью instanceof и in»?

Сужайте типы экземпляров классов и структур объектов Ты практикуешь TypeScript Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать TypeScript Academy?

Предыдущий опыт не требуется. TypeScript Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «Сужение типов с помощью instanceof и in»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке TypeScript Academy?

Да. Каждый урок TypeScript Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Сужение типов с помощью typeof и проверки истинности
  2. Сужение типов с помощью instanceof и in
  3. Пользовательские функции проверки типов
  4. Проверка полноты с помощью never
← Назад к TypeScript Academy