在 Typescript 中使用 Object.keys 时避免隐式的"any"类型



我有一个带有我输入的键的对象,我想对其进行循环并保持其类型,避免"元素"隐式具有'任何''类型,因为'ContactList'没有索引签名"。

我知道这已经在打字稿的github页面上进行了详细讨论,但是我还没有找到任何解决方案的解决方案。用枚举和工会尝试这两种方法,但我仍然会遇到错误。

带有枚举(游乐场)的示例

enum Names {
  Joe,
  Bill,
  Bob
}
type ContactList = {
  [key in Names]: {
    isFriend: boolean;
  }
}
const contactList: ContactList = {
  [Names.Joe]: {
    isFriend: true,
  },
  [Names.Bill]: {
    isFriend: false,
  },
  [Names.Bob]: {
    isFriend: true,
    },
};
Object.keys(contactList).forEach(name => {
    // turn on 'noImplicitAny' and get error
    console.log(contactList[name])
})

与工会(游乐场)的示例

type Names = 'joe' | 'bill' | 'bob'
type ContactList = {
  [K in Names]: {
    isFriend: boolean;
  }
}
const contactList: ContactList = {
  joe: {
    isFriend: true,
  },
  bill: {
    isFriend: false,
  },
  bob: {
    isFriend: true,
    },
};
Object.keys(contactList).forEach(name => {
    // turn on 'noImplicitAny' and get error
    console.log(contactList[name])
})

无论哪种方式,我都告诉Typescript"此对象中唯一允许的密钥来自名称",据我了解索引签名,[key in Names]应该是一个,所以我不确定为什么我看到错误。抱歉,如果这是一个菜鸟问题,我有点绿色,静止不动。谢谢。

as Object.keys可能返回的属性比实际包含的对象更多的属性,其返回类型有意为string[]。否则,良好的代码在运行时抛出意外例外是很常见的。

因此,您必须使索引类型在字符串上工作:

type ContactList = {
  [key: string]: {
    isFriend: boolean;
  },
};

否则您打字并希望获得最好的:

contactList[name as Names]

您也可以:

console.log(...Object.values(contactList));

相关内容

最新更新