流:循环中的推理错误



我有一个代码,该代码试图用属性 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忽略。

最新更新