将函数限制为对象类型
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 例子
我有一个迭代对象属性的函数,如下所示:
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 例子