首页 > 解决方案 > 如果我将检查放入变量中,为什么流程会抱怨?

问题描述

我想使用一个变量来验证一个数组。所以我这样做了:

const length = array ? array.length : 0;

if (length) {
   array.map(_ => _.displayName);
}

为此,我收到一个流程错误:Cannot call 'array.map' because propertymapis missing in undefined [1].Flow(InferError)

标签: javascriptreactjsflowtype

解决方案


如果不知道array.

如果我将检查放入变量中,为什么流程会抱怨?

作为一般规则,这在流程中不起作用。流程的细化非常有限。关于细化的文档基本上列出了支持的每一种细化形式,而检查length不是其中之一。你不能真正做一些事情,比如把某物是某种类型的事实带到以后。看,例如:

// Let's assume `array` is `Array<any> | null` for the sake of this example
const array: Array<any> | null = ([]: any);

我们可以array通过这样做来细化一个数组:

if (Array.isArray(array)) {
  // here, _within this block,_ `array` is of type `Array<any>`
  (array: Array<any>);
}

// Here, `array` is `Array<any> | null` again
(array: Array<any>); // Error! Cannot cast `array` to array type 
  // because null [1] is incompatible with array type [2].

我们也可以做相反的事情:

if (array === null) {
  // here, array is `null`
  (array: null);
} else {
  // and because this is in an `else` block, flow knows that
  // array is `Array<any>` here
  (array: Array<any>);
}

// ...and now it's back to `Array<any> | null` again:
(array: null); // Error! Cannot cast...

因为我们的 union 中只有两个选项,一个是真的,一个是假的,我们可以只检查它的真实性array 来提炼它:

if (array) {
  (array: Array<any>);
} else {
  (array: null);
}

那么我们不能做的事情呢?

Flow 不够聪明,无法理解它arrayIsArray 携带有关精炼的信息array

const arrayIsArray = Array.isArray(array);
if (arrayIsArray) {
  (array: Array<any>); // Error! Cannot cast...
}

作为一般规则,改进的范围仅限于它们出现的语句。

尝试流


推荐阅读