流:for-of循环中的推理错误

时间:2018-02-18 22:52:09

标签: javascript flowtype

我有一个代码,它尝试使用属性 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│

这是流量问题还是我错过了什么?

1 个答案:

答案 0 :(得分:0)

您似乎遇到了issue #935 Type of object value not inferred correctly in for-in loop。您应该可以使用suppress_comment配置,只需在代码中加$FlowFixMe告诉Flow忽略它。