Flowtype:缺少索引器属性

dar*_*rgy 6 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;
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

将上面的代码放在Flow playgound中试试这个.

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

为什么key在接口中需要使用索引器prop IDefaultSettings,当这个代码key从具有已知接口的对象中拉出时- 我的意思是,还有什么key呢?这两个对象,defaultSettings&settings是相同的类型/结构的,IDefaultSettings.

请帮忙,谢谢!

Dav*_*han 5

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

如果切换到,type我们将摆脱该indexer property错误,而是引入一个新错误,即from的返回类型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;
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

(尝试)