Javascript 无法对迭代器上可能未定义的值调用函数
Flow确信以下各项是安全的:Javascript 无法对迭代器上可能未定义的值调用函数,javascript,flowtype,Javascript,Flowtype,Flow确信以下各项是安全的: const a: ?any = {}; if (a!=null) { console.log(a.toString()); } …但在以下方面引发错误: const m: Map<string, string> = new Map(); const iter = m.keys(); const iternext = iter.next(); if (iternext!=null) { const ignore = iternext.v
const a: ?any = {};
if (a!=null) {
console.log(a.toString());
}
…但在以下方面引发错误:
const m: Map<string, string> = new Map();
const iter = m.keys();
const iternext = iter.next();
if (iternext!=null) {
const ignore = iternext.value(); // Flow doesn't like this
}
为什么呢?
使用最新的
0.57.3
进行测试,我相信错误消息是说iternext.value
可能是未定义的
iter.next()
实际上永远不会返回undefined
或null
,因此if
测试是不必要的。当迭代器耗尽时,它将返回{value:,done:true}
。但是,大多数生成器没有返回值,因此它将是{value:undefined,done:true}
,因此流表示“无法对可能未定义的值调用函数”:
const m=newmap([['foo','bar']]);
常数=m.keys();
log(iter.next());
log(iter.next());
log(iter.next())代码>我被流错误消息误导了。将value()
更改为value
不会导致流错误。不过,我不确定我是否理解错误消息或Flow的想法。措辞似乎确实表明潜在的未定义值是iternext
,这毫无意义
公平地说,突出显示的文本似乎表明问题与iternext
没有密切关系:
执行foo.bar()
时,首先检索foo.bar
的值,然后调用该值。由于foo.bar
可以是未定义的
,因此您会看到此消息。更简单的例子:var foo=undefined;foo()代码>。如果iternext
为undefined
,则错误消息将类似于“无法在可能未定义的值上访问属性”。我同意当你第一次读它时听起来很奇怪(我相信这是因为我们“看到”foo.bar()
更多的是foo.(bar())
,而不是(foo.bar)(
),但它在技术上是正确的。
call of method `value`. Function cannot be called on possibly undefined value