Flowtype:缺少索引器属性

时间:2018-03-23 21:30:08

标签: flowtype

给出以下代码:

/* @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可以吗?两个对象defaultSettings& settings具有相同的类型/结构IDefaultSettings

请帮助&谢谢!

1 个答案:

答案 0 :(得分:5)

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

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

你的IDefaultSettings有两个带有对象值的键,因此他们认为它们可能是别的东西。一个解决方案,虽然有点破解,但是通过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