type HandleNodeFn = (parentNode: T, node: T) => T; const getNormalizedNodes = ( node: T, handleNodeFn?: HandleNodeFn ): T[] => { let nodes = [] as T[]; nodes.push(node); node.children?.forEach((subNode: T) => { if (handleNodeFn) { subNode = handleNodeFn(node, subNode); } nodes = nodes.concat(getNormalizedNodes(subNode, handleNodeFn)); }); return nodes; }; export const normalizeTree = ( nodes: T[], handleNodeFn?: HandleNodeFn ): T[] => { let results = [] as T[]; nodes.forEach(node => { results = results.concat(getNormalizedNodes(node, handleNodeFn)); }); return results; };