我有一个代码接收一个对象,迭代它的键并根据另一个配置对象中的特定键存在执行不同的操作 .
这是一个抽象的例子:
type InputObject = {
foo: number,
bar: number,
baz: number,
};
const multipliers = {
bar: 3,
};
function processData(data: InputObject) {
Object.keys(data).forEach(key => {
const value = data[key];
if (Object.keys(multipliers).indexOf(key) !== -1) {
console.log(value * multipliers[key]);
} else {
console.log(value);
}
});
}
如果我使用 flow check
命令检查此代码,则会出现以下错误:
无法获得乘数[key],因为:•对象文字[1]中缺少属性baz . •对象文字[1]中缺少属性foo .
为什么Flow不理解 multipliers[key]
仅在 multipliers
中存在 key
时执行?有没有办法通过更改类型注释来修复错误而不更改代码?
1 回答
流是正确的,因为您的InputObject类型的对象有三个必填字段与乘数只有一个字段栏 . 关键是引用InputObject类型的键 . 一种方法是将密钥转换为新字符串,并将其用作查找的引用 . 然而,这确实使得流失了对键的类型的引用,这就是为什么
$Keys<InputObject>
有助于确保更强的键入 .