请问,下面这个函数,要改为typescript,改了一部分,但 itemMap[id]提示不对,该怎么写呢?

image.png

interface Menus {
  id?: number
  parentId?: number
  state?: number
  children?: Menus[]
}
export function listMenusTree(list: Menus[]) {
  const result = []
  const itemMap: Menus = {}
  for (const item of list) {
    const id = item.id
    const pid = item.parentId

    if (!itemMap[id]) {
      itemMap[id] = {
        children: []
      }
    }

    itemMap[id] = {
      parentId: item.parentId,
      state: item.state,
      children: itemMap[id]['children']
    }

    const treeItem = itemMap[id]

    if (pid === 0) {
      result.push(treeItem)
    } else {
      if (!itemMap[pid]) {
        itemMap[pid] = {
          children: []
        }
      }
      itemMap[pid].children.push(treeItem)
    }
  }
  return result
}
阅读 1.5k
2 个回答

大概写法如下,业务逻辑有可能写错了,你按需调整一下:

interface Menus {
  id?: number;
  parentId?: number;
  state?: number;
  children?: Menus[];
}

type ItemMap = {
  [id: number]: Menus
}

export function listMenusTree(list: Menus[]) {
  const result: Menus[] = [];
  let itemMap: ItemMap = {};

  list.forEach((item) => {
    const { id, parentId } = item;
    if (id != undefined && parentId != undefined) {
      const treeItem = {
        parentId: item.parentId,
        state: item.state,
        children: itemMap[id]['children']
      };

      itemMap[id] = treeItem;

      if (parentId === 0) {
        result.push(treeItem)
      } else {
        itemMap[parentId] = {
          children: [treeItem]
        }
      }
    }
  });
  return result;
}
type ItemMap = { [key: number]: menus };

你要定义一个key是number的type

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题