类型必须具有返回迭代器的“[Symbol.iterator]()”方法

Mat*_*ton 5 typescript

我使用此代码来迭代自定义对象:

interface TableItemBody {
    [fieldId: string]: string
}

interface TableItem {
    [tabId: string]: TableItemBody | TableItemBody[]
}

const iterate = (entry: TableItem) => {
    for (const tabId of Object.keys(entry)) {
        if (Array.isArray(entry[tabId])) {
            for (const idx of entry[tabId]) {
                for (const fieldId of Object.keys(entry[tabId][idx])) {
                    console.log(fieldId)
                }
            }
        } else {
            for (const fieldId of Object.keys(entry[tabId])) {
                console.log(fieldId)
            }
        }
    }
}

const tableItem: TableItem = {
    tab1: {
        field1: 'fieldValue'
    },
    tab2: [{
        field2: 'fieldValue'
    }]
}

iterate(tableItem)
Run Code Online (Sandbox Code Playgroud)

但是,我收到两个错误。第一个是Type 'TableItemBody | TableItemBody[]' must have a '[Symbol.iterator]()' method that returns an iterator.我用来Array.isArray(entry[tabId])确保我实际上正在迭代数组。那么为什么会出现这个错误呢?

如果您想使用该代码,这里是打字稿游乐场的链接。

Ana*_*oly 3

您需要将其投射到TableItemBody[]. 看这里

const iterate = (entry: TableItem) => {
    for (const tabId of Object.keys(entry)) {
        if (Array.isArray(entry[tabId])) {
            const tableItems = entry[tabId] as TableItemBody[]
            for (const tableItem of tableItems) {
                for (const fieldId of Object.keys(tableItem)) {
                    console.log(fieldId)
                }
            }
        } else {
            for (const fieldId of Object.keys(entry[tabId])) {
                console.log(fieldId)
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)