stdout: Охрана типов и сужение в Typescript

Защитники типов (также известные как сужение) позволяют нам создать условия, при которых объект одного типа может быть использован как объект другого типа. Обычно мы используем это в сочетании с типами объединения, чтобы задать различное обращение с типами в зависимости от результирующего значения.

Содержание

  • Использование typeof
  • Использование in
  • Using is
  • Ссылки

Использование typeof

Мы можем использовать ключевое слово typeof в javascript, чтобы узнать тип объекта. Это полезно, если у нас есть объект, который может принимать различные структуры, например

type Data = string[]
type GetData = Data | (() => Data)

Войти в полноэкранный режим Выход из полноэкранного режима

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

const fetchData = (getData: GetData): Data => {
  if (typeof getData === 'function') {
    return getData()
  }

  return getData
}

Войти в полноэкранный режим Выйти из полноэкранного режима

Использование in

В Javascript также есть оператор in, который можно использовать для определения типов, проверяя свойство объекта.

type SimpleData = { 
  name:string;
}

type ComplexData = {
  name: {
    first: string;
    last: string;
  }
  isComplex: true;  
}

type AnyData = SimpleData | ComplexData
Вход в полноэкранный режим Выйти из полноэкранного режима

Затем мы можем использовать оператор in для проверки существования свойства объекта, используя его вместе с ключом, который, как мы ожидаем, должен быть в одном объекте, но не в другом.

const getComplexName = (data: AnyData): string => {
  // isComplex is the name of the key that we expect in `ComplexData` but not `SimpleData`
  if ('isComplex' in data) {
    return [data.name.first, data.name.last].join(' ')
  }

  return data.name
}

Вход в полноэкранный режим Выйти из полноэкранного режима

Использование is

Мы можем использовать ключевое слово typescript is, чтобы указать, что возвращение булевой функции означает, что переменная удовлетворяет определенному условию.

Например, мы можем создать функцию, которая в основном делает то же самое, что и оператор in в приведенной выше функции:

const isComplex = (data: AnyData): data is ComplexData => {
  return (data as ComplexData).isComplex
}

Войти в полноэкранный режим Выйти из полноэкранного режима

Это можно использовать вместо проверки in в приведенном выше примере следующим образом:

const getComplexName2 = (data: AnyData): string => {
  // isComplex is the name of the key that we expect in `ComplexData` but not `SimpleData`
  if (isComplex(data)) {
    return [data.name.first, data.name.last].join(' ')
  }

  return data.name
}

Войти в полноэкранный режим Выйти из полноэкранного режима

Ссылки

  • Мои заметки TS
  • MDN Оператор in
  • MDN Оператор typeof
  • TS Docs on Narrowing

Оцените статью
Procodings.ru
Добавить комментарий