Flow抱怨对Object.values回调中的对象的方法调用

时间:2017-07-09 21:42:07

标签: javascript flowtype

这是我的代码(也可在flow.org/try上查看):

/**
 * @flow
 */

class Person {
  name: string

  constructor(name) {
    this.name = name
  }

  sayHi() {
    console.log(`Hi, I'm ${this.name}`)
  }
}

const people = {
  john: new Person('John Smith'),
  jack: new Person('Jack Leonard')
}

Object.values(people).forEach(person => {
  person.sayHi() // this line causes an issue with flow
})

我不喜欢我使用person.sayHi()的事实。我收到这个错误:

21:   person.sayHi()      
      ^ call of method `sayHi`. Method cannot be called on
21:   person.sayHi()
      ^ mixed

似乎Object.values返回Array<mixed>类型。我试着像这样对类型进行细化:

Object.values(people).forEach(person => {
  if (typeof person === 'object' && person != null) {
    person.sayHi()
  }
})

但是,这仍然会出错:

22:     person.sayHi()        
        ^ call of method `sayHi`. Function cannot be called on
[LIB] static/v0.49.1/flowlib/core.js:52:     static values(object: any): Array<mixed>;
                                                                               ^ mixed

任何有关让它发挥作用的提示将不胜感激。

1 个答案:

答案 0 :(得分:0)

  嗯,流量似乎不喜欢那种类型转换

是的,这只是一个快速猜测。流动不是我的强项。

“问题”是this declaration。我不知道你能否以某种方式在流程中覆盖这个声明。我甚至不确定这对于像Object.values()那样通用的东西是个好主意。

我希望有一些像我试过的类型铸造;因为它可能在Typescript中。类似的事情:我比你知道我们正在处理什么,所以把它投到...... 但是我没有在文档中找到任何内容。

同时你可以使用它:

function typedValues<T>(object: {[key:string]: T}): Array<T> {
    return Object.keys(object).map(key => object[key]);
}

typedValues(people).forEach((person:Person) => {
    person.sayHi();
})

键入person不是必需的,但如果数组包含外部类型,则它会提供更好的错误消息。