这里没有寻找解决方案,只需要知道这是否是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
})