首页 文章

尝试通过动态密钥获取对象值时出现Flowtype错误

提问于
浏览
1

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

这是一个抽象的例子:

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 回答

  • -1

    流是正确的,因为您的InputObject类型的对象有三个必填字段与乘数只有一个字段栏 . 关键是引用InputObject类型的键 . 一种方法是将密钥转换为新字符串,并将其用作查找的引用 . 然而,这确实使得流失了对键的类型的引用,这就是为什么 $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);
        }
    });
    

相关问题