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! Сокращённая запись ?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