gpt4 book ai didi

javascript - 在 Typescript 中使用 Object.keys 时避免隐式 'any' 类型

转载 作者:搜寻专家 更新时间:2023-10-30 21:07:50 24 4
gpt4 key购买 nike

我有一个带有我键入的键的对象,我想遍历它并维护它们的类型,避免“元素隐式具有‘任何’类型,因为‘ContactList’没有索引签名”。

我知道这已经在 Typescript 的 GitHub 页面上进行了详细讨论,但我还没有找到任何解决方案来解决我在这里要做的事情。尝试使用枚举和联合,但我仍然遇到错误。

枚举示例 ( playground )

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])
})

联合示例 ( playground )

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] 应该是一个,所以我我不确定为什么会看到错误。抱歉,如果这是一个菜鸟问题,我对 TS 还是有点陌生​​。谢谢。

最佳答案

由于 Object.keys 可能会返回比对象实际包含的属性更多的类型,它的返回类型是 intentionally输入为 string[]。否则,类型良好的代码在运行时抛出意外异常是很常见的,如 explained in this answer .

因此你必须让你的索引类型适用于字符串:

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

或者你打字并希望最好的:

contactList[name as Names]

你也可以:

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

关于javascript - 在 Typescript 中使用 Object.keys 时避免隐式 'any' 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55011797/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com