javascript - 如果我将检查放入变量中,为什么流程会抱怨?
问题描述
我想使用一个变量来验证一个数组。所以我这样做了:
const length = array ? array.length : 0;
if (length) {
array.map(_ => _.displayName);
}
为此,我收到一个流程错误:Cannot call 'array.map' because property
mapis missing in undefined [1].Flow(InferError)
解决方案
如果不知道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...
}
作为一般规则,改进的范围仅限于它们出现的语句。
(尝试流)
推荐阅读
- python - AttributeError:模块“模型”没有属性“check_pw”
- apache-flink - Python API 是否支持 DataStream 和 Table 之间的转换
- python - 3 d 矩阵图,其中 x ad y 是 1 d 数组
- algorithm - 递归 T(n)= 2T(n-1) + (2^n)
- javascript - 无服务器错误 - CloudFormation 模板无效 - 部署期间
- c# - 向 Amazon SQS 发送大量消息
- python - Python:通过搜索值从二维数组中获取记录的最快方法?
- c# - JSON反序列化:输入日期时间?输出选项
- r - 无法从数据库中删除科学记数法
- firebase - 谷歌云功能:警告,FIREBASE_CONFIG 和 GCLOUD_PROJECT 环境变量丢失。初始化 firebase-admin 将失败