尝试通过动态键获取对象值时发生流类型错误

时间:2018-09-26 19:25:05

标签: javascript flowtype

我有一个接收对象的代码,它迭代其键并根据另一个配置对象中特定键的存在执行不同的操作。

这是一个抽象的例子:

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? 有什么方法可以通过更改类型注释而不更改代码来解决错误?

1 个答案:

答案 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);
    }
});