Spec-Zone.ru › Flow

Неизвестный

unknown — это супертип всех типов. Все значения являются unknown, но перед выполнением любых операций над значением unknown необходимо выполнить его уточнение.

Сравнение с TypeScript

unknown в Flow — это тот же самый верхний тип, что и unknown в TypeScript. Полное сравнение см. в разделе Обозначения типов в Flow и TypeScript.

Когда это использовать​

Используйте unknown вместо any, когда нужно принимать произвольные значения: unknown требует выполнить уточнение перед использованием, поэтому его безопасно использовать с точки зрения типов. Если набор возможных типов известен заранее, для большей конкретики используйте объединение.

Обзор​

В целом программы содержат несколько категорий типов:

Один тип:

Здесь входное значение может быть только number.

function square(n: number) {
  return n * n;
}

Группа различных возможных типов:

Здесь входное значение может быть либо string, либо number.

function stringifyBasicValue(value: string | number) {
  return '' + value;
}

Тип, основанный на другом типе:

Здесь возвращаемый тип будет совпадать с типом значения, переданного функции.

function identity<T>(value: T): T {
  return value;
}

Эти три категории типов встречаются чаще всего. Они составляют большую часть типов, которые вы будете создавать.

Однако есть и четвёртая категория.

Произвольный тип, которым может быть что угодно:

Здесь переданное значение имеет неизвестный тип: это может быть любой тип, и функция всё равно будет работать.

function getTypeOf(value: unknown): string {
  return typeof value;
}

Такие неизвестные типы встречаются реже, но иногда всё же полезны.

Для представления этих значений следует использовать unknown.

Принимается что угодно, но ничего не возвращается​

unknown принимает значения любого типа. Подойдут строки, числа, объекты, функции — что угодно.

function stringify(value: unknown) {
  // ...
}


stringify("foo");
stringify(3.14);
stringify(null);
stringify({});

При попытке использовать значение типа unknown сначала необходимо выяснить его фактический тип, иначе возникнет ошибка.

function stringify(value: unknown) {
  return "" + value; // Error!
}


stringify("foo");

Вместо этого следует убедиться, что значение имеет определённый тип, выполнив его уточнение.

function stringify(value: unknown) {
  if (typeof value === 'string') {
    return "" + value; // Works!
  } else {
    return "";
  }
}


stringify("foo");

Благодаря проверке typeof value === 'string' Flow знает, что внутри инструкции if значение value может быть только string. Это называется уточнением.

В сравнении с any​

unknown безопасен, а any — нет. Оба типа принимают любые значения, но any также небезопасно разрешает любые операции.

В сравнении с empty​

unknown — противоположность empty:

  • Всё является unknown, но до уточнения до конкретного типа над ним разрешено выполнять лишь несколько операций. Это супертип всех типов.
  • Ничто не является empty, но над ним разрешены любые операции. Это подтип всех типов.

Уточнение unknown​

typeof — наиболее распространённый способ сузить значение unknown (полный список форм см. в разделе «Уточнения»), но при работе с unknown также регулярно используются несколько других идиом.

Array.isArray​

Сужает unknown до ReadonlyArray<unknown>. Элементы по-прежнему имеют тип unknown, и перед использованием их необходимо уточнить.

declare const value: unknown;
if (Array.isArray(value)) {
  value as ReadonlyArray<unknown>; // OK
}

'key' in value​

Оператор in требует, чтобы его правый операнд уже был ненулевым объектом, поэтому применение 'key' in value к простому значению типа unknown приводит к ошибке типа. Сначала сузьте тип до объекта; затем in уточнит значение до объекта с этим свойством (тип свойства — unknown, и перед использованием его нужно дополнительно уточнить):

declare const value: unknown;
if (typeof value === 'object' && value !== null && 'foo' in value) {
  value as {readonly foo: unknown, ...}; // OK
}

Шаг value !== null необходим, потому что typeof null === 'object'.

instanceof​

value instanceof SomeClass сужает unknown до этого класса:

class User {
  name: string = '';
}


declare const value: unknown;
if (value instanceof User) {
  value.name as string; // OK
}

См. также​

  • Уточнения — как сузить значения unknown до конкретных типов перед использованием
  • Иерархия типов — взаимосвязь unknown, any и empty в полной иерархии типов
  • Модернизация устаревшего синтаксиса Flow — переход с устаревшего типа mixed на unknown

© 2013–present Facebook Inc.
Licensed under the MIT License.
https://flow.org/en/docs/types/unknown

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API