我有一个遍历对象属性的函数,如下所示:
function somef(obj) {
for (const prop in obj) {}
}
这被 Flowtype 报告为一个可能的字符串:
Cannot iterate using a `for...in` statement because string [1] is not an object, null, or undefined. [invalid-in-rhs]
54| for (const prop in obj) {}
^^^
References:
54| for (const prop in obj) {}
^^^^ [1]
我尝试将 obj
输入为 any
,并进行检查,但随后它允许将 string
传递给 somef()
,我理解为 string
成为any
:
function somef(obj:any) {
for (const prop in obj) {} // Would fail at runtime
}
somf("mystring) // Checks
是否可以将 somef
限制为仅接受形式为 obj
的括号对象 {}
,我可以在其上调用:for (prop in obj) {}
on?
答案 0 :(得分:1)
您的问题是您没有为函数提供任何显式类型 def,因此它根据周围的代码隐式定义类型,假设它是用字符串调用的,它会假设 obj
是一个字符串并且它不能循环。它正确地抛出了一个错误,只是因为这个隐式类型的 def 不在你期望的地方。
如果你知道对象的确切结构,你可以输入
function somef(obj: { a: string, b: string }) {
for (const prop in obj) {}
}
但如果它更不为人知,我推荐索引器对象,
function somef(obj: { [key: string]: any }) {
for (const prop in obj) {} // Would fail at runtime
}
文档:https://flow.org/en/docs/types/objects/
try 示例