typescript 迭代嵌入对象键时处理隐式“any”[duplicate]

7dl7o3gd  于 2023-01-14  发布在  TypeScript
关注(0)|答案(1)|浏览(101)
    • 此问题在此处已有答案**:

(18个答案)
昨天关门了。
下面是一个简单的测试案例,来说明我正在与之斗争的问题:

const testCase = {a:{b:"result"}}

for (const i in testCase) {
    console.log("i", i)
    for (const j in testCase[i]){
        console.log("j", j)
    }
}

这将失败:

error TS7053: Element implicitly has an 'any' type because expression of type 'string' can't be used to index type '{ a: { b: string; }; }'.
  No index signature with a parameter of type 'string' was found on type '{ a: { b: string; }; }'.

5     for (const j in testCase[i]){

我可以通过将i转换为keyof typeof testCase来解决这个问题。

const testCase = {a:{b:"result"}}

for (const i in testCase) {
    let typedIndex = i as keyof typeof testCase
    console.log("i", i)
    for (const j in testCase[typedIndex]){
        console.log("j", j)
    }
}

然而,这会变得很麻烦,这取决于我需要迭代多少个子对象?有没有更好的方法来处理这个问题,或者我只是在朝着一个反模式前进,即没有为testCase预定义的形状。

guicsvcw

guicsvcw1#

我想我可能已经找到了答案,除非我显式地设置testCase的键是什么,否则它们根据定义就是any,所以通过修改它来使用这样的接口:

interface TestCase {
    [prop:string]: {
        [prop:string]: string
    }
}
const testCase:TestCase = {a:{b:"result"}}

当我运行for...in循环时,它将知道返回的key的类型。
以下是完整版本:

interface TestCase {
    [prop:string]: {
        [prop:string]: string
    }
}
const testCase:TestCase = {a:{b:"result"}}

for (const i in testCase) {
    console.log("i", i)
    for (const j in testCase[i]){
        console.log("j", j)
    }
}

相关问题