我有一个代码,该代码试图用属性 id 和_name验证指定类型的对象。属性 id 应该是一个数字, name 应该是 foot type中声明的字符串。
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│
这是流程的问题还是我缺少某些东西?
看起来您正在遇到#935的对象值的类型,在for-in循环中未正确推断。您应该能够使用suppress_comment
配置,然后将$FlowFixMe
放入代码中以告诉Flow忽略。