typescript - Typen må ha en '[Symbol.iterator]()'-metode som returnerer en iterator


Jeg bruker denne koden for å iterere gjennom et tilpasset objekt:

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)

Men jeg får to feil. Den første er Type 'TableItemBody | TableItemBody[]' must have a '[Symbol.iterator]()' method that returns an iterator. Jeg bruker Array.isArray(entry[tabId]) for å sikre at jeg faktisk itererer gjennom et array. Så hvorfor dukker denne feilen opp?

Hvis du vil leke med den koden, her er lenken til TypeScript-lekeplassen.

Svar #1

Du må kaste det til TableItemBody[]. Se her

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

Relaterte artikler