如何在TypeScipt中遍历对象-一种正确的方法



这里没有寻找解决方案,只需要知道这是否是TYPESCRIPT中的BUG。仅此而已。

这是TypeScript中的错误吗?我应该报告这个错误吗?据我所知,这应该有效,除非我在这里做错了什么,

interface Something {
key1: string;
key2: number;
key3: boolean;
}
const someObject: Something = {
key1: '123',
key2: 123,
key3: false
}
for (const key in someObject) {
console.log(someObject[key]); // TS error
}

注意:我不是在寻找一个变通方法,因为这对我有效。只是想知道我是否做错了什么,或者TS中是否真的有漏洞。

for (const [key, value] of Object.entries(someObject)) {
console.log(key, value);
}

for (const key in values) {
console.log(key, values[key as keyof DirectDepositDTO]);
}

我知道key的类型是string,但它不应该是keyof Something吗?

TypeScript游乐场链接

附言:这个问题被标记为重复,但我不是在这里寻求解决方案,我已经知道如何修复它了。我只需要知道这是否是TypeScript中的一个错误。因为for (const key in someObject) {意味着key将是keyof Something。我不需要知道重新定义类型。

您有几种方法。

如果您想使用for .. in循环,您应该允许TS使用索引属性:

interface Something {
key1: string;
key2: number;
key3: boolean;
}
type Values<T> = T[keyof T]
type MakeIndexed<T> = T & { [prop: string]: Values<T> }
type SomethingIndexed = MakeIndexed<Something>
const someObject: SomethingIndexed = {
key1: '123',
key2: 123,
key3: false
}
for (const key in someObject) {
const x = someObject[key] // Values<Something>
const isString = someObject.key1 // string
console.log(someObject[key]);
}

您也可以使用更多的功能方法,而不需要额外的实用程序类型,但需要类型转换:

const someObject: Something = {
key1: '123',
key2: 123,
key3: false
}
// FP way with more explicit types
const keys2 = (Object.keys(someObject) as Array<keyof typeof someObject>).forEach(key => {
const result = someObject[key]; // string | number | boolean
})

相关内容

最新更新