这是我的代码(也可在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
任何有关让它发挥作用的提示将不胜感激。
答案 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
不是必需的,但如果数组包含外部类型,则它会提供更好的错误消息。