我有一个接收对象的代码,它迭代其键并根据另一个配置对象中特定键的存在执行不同的操作。
这是一个抽象的例子:
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
命令检查此代码,则会出现以下错误:
无法获得乘数[键],因为:
•对象文字[1]中缺少属性baz。
•对象文字[1]中缺少属性foo。
为什么仅当multipliers[key]
中存在key
时,Flow才不知道执行multipliers
?
有什么方法可以通过更改类型注释而不更改代码来解决错误?
答案 0 :(得分:-1)
流程是正确的,因为您的InputObject类型的对象具有三个必填字段,而乘法器只有一个字段栏。该键是指InputObject类型的键。
一种方法是将key强制转换为新字符串,并将其用作查找参考。但是,这确实使流程失去了对键类型的引用,这就是$Keys<InputObject>
对于确保更强的键入意义的原因。
type InputObject = {
foo: number,
bar: number,
baz: number
}
const multipliers = {
bar: 3,
}
function processData(data: inputObject) {
Object.keys(data).forEach(key: $Keys<InputObject> => {
const value = data[key];
const lookupKey = String(key);
if (multipliers.hasOwnProperty(lookupKey)) {
console.log(value * multipliers[lookupKey]);
else {
console.log(value);
}
});