如何在这种情况下修复错误(保持使用类作为类型):
/* @flow */
class Person {
name: string;
age: number;
}
const person: Person = new Person();
person.name = 'Bob';
person.age = 25;
['name', 'age'].forEach(key => {
if(person[key]) {
console.log(person[key]);
}
});
该错误指向person[key]
并说:
无法获取
person[key]
,因为Person
中缺少索引器属性
在类似的情况下(可能是不同的流程版本),它说:
计算属性。在
Person
中找不到可索引签名
我认为更大的问题是Array.prototype.forEach
有这种类型
forEach(callbackfn: (value: T, index: number, array: $ReadOnlyArray<T>) => any, thisArg?: any): void;
https://github.com/facebook/flow/blob/3baafb0f2191353cd896d6fe087aea535bc8606e/lib/core.js#L211。
您可以看到value
参数的类型为T
,它由数组中元素的类型决定。在你的情况下,Flow(很可能)假设数组['name', 'age']
的类型为string[]
。因此,类型T
设置为string
。
现在,当您尝试访问person[key]
时,Flow会抱怨您缺少索引器属性。这是准确的,因为您尝试在string
实例上使用通用Person
访问。即使在删除条件后,此问题仍然存在,这暗示Flow无法将string
类型细化为'name'
和'age'
之一。
如果Flow可以改进这样的东西会很好
/* @flow */
class Person {
name: string;
age: number;
}
const person: Person = new Person();
person.name = 'Bob';
person.age = 25;
['name', 'age'].forEach(key => {
if (key === 'name') {
console.log(person[key]);
}
});
不一定是因为它有用,但因为它是如此明确,并且应该是那时的安全访问。
我会尽量避免在属性列表中使用循环来获取/设置对象的属性,因为Flow不会处理像元组一样行动的数组的细微差别。此外,在对象的属性发生变化的情况下,循环遍历对象本身(例如,Object.keys
)更具有前瞻性。