Хорошо, учитывая функцию, которая принимает / создает тип Maybe (например, число);Тогда другая функция, которая не принимает этот тип может быть.Чтобы заставить его «работать», я защищаю функцию, которая не принимает возможный тип, добавляя условное выражение вокруг него.
Простой пример:
/* @flow */
export function nullOrUndefined(val: mixed): boolean {
return val === null || val === undefined;
}
function foo(x: ?number) {
console.log(!nullOrUndefined(x) ? addOne(x) : null);
}
function addOne(x: number) {
return x + 1;
}
nullOrUndefined
будетбудь универсальным защитником, я создал его, чтобы иметь простую полезную функцию, которая выразительна, поэтому мне не нужно постоянно вводить «сложный» тест в строку.
Вышеупомянутая функциональность будет работать, и не будеткинь ошибку.(До тех пор, пока foo
получает число, неопределенное или нулевое.
Однако поток выдает следующую ошибку:
8: console.log(!nullOrUndefined(x) ? addOne(x) : null);
^ Cannot call `addOne` with `x` bound to `x` because null or undefined [1] is incompatible with number [2].
References:
7: function foo(x: ?number) {
^ [1]
12: function addOne(x: number) {
^ [2]
Небольшой тест
Я понимаю, почему возникает эта ошибка (поток не может посмотреть какую-либо произвольную функцию, и nullOrUndefined
даже не будет быть в том же файле.
Но как я могуисправить это? Кроме // $FlowFixMe
? Или это тот случай, когда явное "игнорирование строки" является правильным использованием?