interface INestable { nestedList?: T[]; } interface Item extends INestable { id: number; nestedList?: Item[]; } const recursiveStructure: Item[] = [ { id: 1, nestedList: [ { id: 11, }, { id: 22, nestedList: [ { id: 33, } ] } ] } ]; function forEachDeep>(array: T[], callback: (item: T) => void): void { array.forEach((elem: T) => { if (elem.nestedList) { forEachDeep(elem.nestedList, callback) } callback(item) }) }