【问题标题】:Flow complaining about method calls on an object within an Object.values callback流抱怨在 Object.values 回调中对对象的方法调用
【发布时间】:2017-12-13 13:16:17
【问题描述】:

这是我的代码(也可以在 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

任何有关使其工作的提示将不胜感激。

【问题讨论】:

  • 试试(Object.values(people): Array&lt;Person&gt;).forEach(person =&gt; { person.sayHi() })
  • 嗯,流doesn't seem to like那个类型转换。

标签: javascript flowtype


【解决方案1】:

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

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

“问题”是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 不是强制性的,但如果数组包含外来类型,它会提供更好的错误消息。

【讨论】:

  • Flow 中的铸件是安全的。如果你想做一个不安全的演员,你必须通过any(一个不安全的类型)进行转换,例如((foo: any): TypeIWant)。这将告诉 Flow 只信任您。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-26
  • 2011-10-22
  • 1970-01-01
  • 1970-01-01
  • 2014-11-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多