Example here.

为什么在我遍历数字为1的所有属性并因此没有长度方法的情况下,流动不引发错误?

const myBeer: {name: string, size: number} = {
 name: 'Rothaus',
 size: 1
}
myBeer.size.length // Throws as expected
for (let key in myBeer) {
  const value = myBeer[key];
  value.length; // Why doesn't this throw?
}

最佳答案

在循环中动态访问对象的字段时,值可以是任何值。即使myBeer的类型为{name: string, size: number},它也可以具有其他任何类型的字段,因此Flow甚至无法将类型推断为string | number

不论好坏,Flow都会将所有这些字段的类型推断为any。我会选择?any,但我们在那里。

即使您没有使用Flow,这也是一个很好的例子,说明了为什么不应该迭代混合类型的对象映射。这种类型感觉像是记录,而不是集合。因此,将其视为记录,然后直接访问您需要的字段。

关于javascript - 在for..in循环中,为什​​么访问可能无效的属性时Flow不会抛出异常?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44829720/

10-09 15:00