Как «исправить» типы потока, когда вы знаете из логики, что тип правильный? - PullRequest
0 голосов
/ 02 марта 2019

Хорошо, учитывая функцию, которая принимает / создает тип 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? Или это тот случай, когда явное "игнорирование строки" является правильным использованием?

1 Ответ

0 голосов
/ 02 марта 2019

Ах, у Flow есть первоклассная поддержка для вашего дела.Ваша ошибка может быть исправлена ​​добавлением одного токена: %checks.

export function nullOrUndefined(val: mixed): boolean %checks {
  ...

(попробуйте ссылку)

%checks используется для указания потокачто указанная функция является предикатом уточнения типа .Имейте в виду, что уточнение в потоке довольно простое, и его очень легко спутать с функцией, в принципе более сложной, чем ваша.

...