Javascript 无法对迭代器上可能未定义的值调用函数

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

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.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