流程满足以下是安全的:
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
。
答案 0 :(得分:1)
我认为错误消息是iternext.value
可能是undefined
。
iter.next()
实际上永远不会返回undefined
或null
,因此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)