Typescript中,多类型数组遍历该如何定义?

以下代码中,声明a为两种对象的复合数组,遍历时我想同时取type cmd child的值,然后通过if来判断是否存在进行数据处理,该如何书写?

const a: (
  | { type: string; cmd: number }
  | { type: string; child: number[] })[] = [
  {
    type: "aaa",
    cmd: 111
  },
  {
    type: "bbb",
    child: [1, 2, 3, 4]
  }
];

// 报错 Property 'cmd' does not exist on type '{ type: string; cmd: number; } | { type: string; child: number[]; }'.
a.forEach(({ type, cmd, child }) => {
  // doSomething
});
阅读 3.7k
2 个回答
type Cmd = { type: string; cmd: number };
type Child = { type: string; child: number[] };
const a: (Cmd | Child)[] = [
  {
    type: "aaa",
    cmd: 111
  },
  {
    type: "bbb",
    child: [1, 2, 3, 4]
  }
];

function hasCmd(d: Cmd | Child): d is Cmd {
  return 'cmd' in d;
}

a.forEach(item => {
  if (hasCmd(item)) {

  } else {
    
  }
});
const a: ({ type: string; cmd: number; child?: never } | { type: string; child: number[]; cmd?: never })[] = [
    {
        type: 'aaa',
        cmd: 111,
    },
    {
        type: 'bbb',
        child: [1, 2, 3, 4],
    },
]
a.forEach((d) => {
    if(d.child){
    }else{
        d.cmd
    }
})

这种情况下不能在函数参数使用解构语法,会有类型丢失
其实还可以进一步用自定义泛型,只不过没时间写