将功能限制为对象类型

时间:2021-08-01 17:02:20

标签: flowtype

我有一个遍历对象属性的函数,如下所示:

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?

1 个答案:

答案 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 示例