我有一个代码,它尝试使用属性 id 和_name来验证指定类型的对象。属性 id 应该是一个数字, name 应该是 FooT 类型中声明的字符串。
function number(value: mixed): number {
if (typeof value === "number") return value
throw new TypeError("number required")
}
function string(value: mixed): string {
if (typeof value === "string") return value
throw new TypeError("string required")
}
function objectOf(attrs, value) {
const obj = {}
for (const key of Object.keys(attrs)) {
const typeFn = attrs[key]
obj[key] = typeFn(value[key])
}
return obj
}
type FooT = {
id: number,
name: string
}
const fooT: FooT = objectOf(
{
id: number,
name: string
},
{
id: 1,
name: "Foo"
}
)
正在运行的流程显示此错误。由于某种原因,在动态访问对象属性值时,在for-of
循环中未正确确定 typeFn 的推断返回类型。
Cannot assign objectOf(...) to fooT because:
• string [1] is incompatible with number [2] in property id.
• number [3] is incompatible with string [4] in property name.
[3] 3│ function number(value: mixed): number {
:
[1] 8│ function string(value: mixed): string {
:
[2] 22│ id: number,
[4] 23│ name: string
24│ }
25│
26│ const fooT: FooT = objectOf(
27│ {
28│ id: number,
29│ name: string
30│ },
31│ {
32│ id: 1,
33│ name: "Foo"
34│ }
35│ )
36│
这是流量问题还是我错过了什么?
答案 0 :(得分:0)
您似乎遇到了issue #935 Type of object value not inferred correctly in for-in loop。您应该可以使用suppress_comment
配置,只需在代码中加$FlowFixMe
告诉Flow忽略它。