函数不能在迭代器上的可能未定义的值上调用

时间:2017-10-19 22:50:48

标签: javascript flowtype

流程满足以下是安全的:

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
}

错误是:

call of method `value`. Function cannot be called on possibly undefined value

为什么? 使用最新的0.57.3

进行测试

2 个答案:

答案 0 :(得分:1)

我认为错误消息是iternext.value可能是undefined

iter.next()实际上永远不会返回undefinednull,因此if测试是不必要的。当迭代器耗尽时,它将返回{value: <return value>, done: true}。大多数生成器没有返回值,因此它将是{value: undefined, done: true},因此Flow说“函数无法在可能未定义的值上调用”

const m = new Map([['foo', 'bar']]);
const iter = m.keys();
console.log(iter.next());
console.log(iter.next());
console.log(iter.next());

调用 iternext.value()肯定是错误的,因为你有一个字符串映射。如果你有一个函数映射(并且迭代器没有用完),你只能调用它。

您可能想再次查看iterator protocol

答案 1 :(得分:0)

我被Flow错误消息误导了。将value()更改为value会导致无错误。尽管如此,我不确定我是否理解错误消息或Flow认为发生了什么。措辞似乎确实表明潜在的未定义值是iternext,这没有任何意义。

在Flow的公平性中,突出显示的文本确实表明该问题与iternext的关系不是很紧密:

enter image description here