【问题标题】:Flowtype: indexer property is missing inFlowtype:索引器属性在
【发布时间】:2018-09-02 15:42:21
【问题描述】:

给定以下代码:

/* @flow */
interface IDefaultSettings {
  Drivers?: {},
  Options?: {}
}

const defaultSettings: IDefaultSettings = {
  Drivers: {},
  Options: {}
}

const settings: IDefaultSettings = {};

mergeSettings(settings);

function mergeSettings(settings: IDefaultSettings) {
  for (const [key, setting] of Object.entries(defaultSettings)) {
    switch(key) {
      case 'Drivers':
      case 'Options':
        settings[key] = setting;
        break;
    }
  }
}

将上面的代码放在Flow playgound 中尝试一下。

我收到此 lint 错误,无法解决:"Cannot assign `setting` to `settings[key]` because an indexer property is missing in `IDefaultSettings` [1]."

为什么key 的使用需要接口中的索引器道具IDefaultSettings,当这段代码从具有已知接口的对象中提取key 时——我的意思是,key 还能是什么?两个对象 defaultSettingssettings 具有相同的类型/结构 IDefaultSettings

请帮忙,谢谢!

【问题讨论】:

    标签: flowtype


    【解决方案1】:

    我不确定您为什么选择使用interface 而不是type,尽管这不是问题的具体原因。这确实意味着流程无法确定哪些属性名称是有效的。请注意,flow 在这方面不是很好,但部分原因在于它是一个静态类型检查器,因此无法全面比较变量中的任何内容。

    如果我们切换到type,我们就摆脱了indexer property错误,但引入了一个新错误,即Object.entries的返回类型是一个元组,其值为mixed类型。

    您的 IDefaultSettings 有两个带有对象值的键,因此 flow 对它们可能是其他东西的想法持反对态度。一个解决方案,虽然有点hack,是通过any 转换值。或者,使用$FlowFixMe 注释语法并记录您忽略错误的原因。

    type IDefaultSettings = {
      Drivers?: {},
      Options?: {}
    }
    
    const defaultSettings: IDefaultSettings = {
      Drivers: {},
      Options: {}
    }
    
    const settings: IDefaultSettings = {};
    
    mergeSettings(settings);
    
    function mergeSettings(settings: IDefaultSettings) {
      for (const [key, setting] of Object.entries(defaultSettings)) {
        switch(key) {
          case 'Drivers':
          case 'Options':
            settings[key] = (setting: any);
            break;
        }
      }
    }
    

    (Try)

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-16
    • 2010-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-15
    • 2010-11-08
    相关资源
    最近更新 更多