将函数限制为对象类型

Restricting function to object type

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

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(),我理解为 [=15] =] 是 any:

function somef(obj:any) {
    for (const prop in obj) {}    // Would fail at runtime
}
somf("mystring)  // Checks

是否可以将 somef 限制为仅接受形式为 {} 的括号对象 obj,我可以在其上调用:for (prop in obj) {} on?

你的问题是你没有给函数任何明确的类型定义,所以它根据它周围的代码隐式定义类型,假设它是用字符串调用的,它会假设 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 例子