Spec-Zone.ru › Flow

Maybe-типы

?T — это сокращённая запись для объединения T | null | void. Оно принимает значение, null или undefined.

function acceptsMaybeNumber(value: ?number) {
  // ...
}


acceptsMaybeNumber(42);        // Works!
acceptsMaybeNumber();          // Works! (implicitly undefined)
acceptsMaybeNumber(undefined); // Works!
acceptsMaybeNumber(null);      // Works!
acceptsMaybeNumber("42");      // Error!
Сравнение с TypeScript

Сокращённая запись ?T в Flow не имеет эквивалента в TypeScript — она разворачивается в T | null | void, написание в Flow типа T | null | undefined из TypeScript. Полное сравнение см. в разделе Написание типов в Flow и TypeScript.

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

Предпочитайте ?T для значений, которые могут полностью отсутствовать (необязательная конфигурация, неинициализированное состояние). Используйте вместо этого T | null, если хотите принимать null, но при этом требовать, чтобы вызывающий код явно передавал аргумент. Для необязательных свойств объектов используйте синтаксис key?: T, а не key: ?T — см. раздел необязательные свойства.

Maybe-типы в качестве параметров функций​

Поскольку ?T включает void, его использование в качестве типа параметра функции делает аргумент неявно необязательным — вызывающий код может полностью опустить его. Если нужно, чтобы вызывающий код всегда передавал аргумент, но при этом принимать null, используйте вместо этого T | null:

function acceptsNull(value: number | null) {
  // ...
}


acceptsNull(42);   // Works!
acceptsNull(null); // Works!
acceptsNull();     // Error! Argument is required.

В случае объектов отсутствующее свойство — это не то же самое, что свойство, явно равное undefined.

function acceptsMaybeProp({value}: {value: ?number}) {
  // ...
}


acceptsMaybeProp({value: undefined}); // Works!
acceptsMaybeProp({});                 // Error!

Если вы хотите разрешить отсутствие свойств, используйте синтаксис необязательного свойства, в котором ? располагается перед двоеточием. Также можно объединить оба синтаксиса, чтобы получить необязательный Maybe-тип, например {value?: ?number}.

Уточнение Maybe-типов​

Предположим, у нас есть тип ?number. Если мы хотим использовать это значение как number, сначала нужно проверить, что оно не null и не undefined.

function acceptsMaybeNumber(value: ?number): number {
  if (value !== null && value !== undefined) {
    return value * 2;
  }
  return 0;
}

Две проверки на null и undefined можно заменить одной проверкой != null, которая выполнит обе проверки.

function acceptsMaybeNumber(value: ?number): number {
  if (value != null) {
    return value * 2;
  }
  return 0;
}

В JavaScript обычно не рекомендуют использовать проверки с двойным знаком равенства, но приведённый выше шаблон безопасен (он проверяет именно null и undefined).

Можно также поступить наоборот и перед использованием убедиться, что значение имеет тип number.

function acceptsMaybeNumber(value: ?number): number {
  if (typeof value === 'number') {
    return value * 2;
  }
  return 0;
}

Однако уточнения типов могут теряться. Например, вызов функции после уточнения типа свойства объекта сделает это уточнение недействительным. Подробнее см. в документации о сбросе уточнений, чтобы понять, почему Flow работает именно так и как избежать этой распространённой ошибки.

См. также​

  • Объединения — общая форма: ?T — это сокращённая запись для T | null | void
  • Уточнения — как сузить Maybe-типы перед использованием
  • Примитивы — типы null и void, а также необязательные параметры

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

Spec-Zone.ru

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