使用typescript时入参允许是array和object,在内部应该如何解决使用filter方法报错问题?

写了一个过滤空字段的方法,希望入参允许数组和对象,把其中不为空的元素筛选出来,但是在使用filter方法时提示错误

报错截图如下
image.png

代码截图
image.png

代码

function filterEmptyKey (param: any[] | object): any[] | object {
  const type = getDataType(param);
  if (type === 'array') {
    // ts中filter方法会报错
    return param.filter(value => !isNull(filterEmptyKey(value)));
  } else if (type === 'object') {
    return Object.keys(param).filter(key => !isNull(filterEmptyKey(param[key])));
  } else {
    console.warn('filterEmptyKey:参数不是对象或者数组');
    return param;
  };
};

请问这种报错出现的原因和解决方法?

目前收到两种原因:
第一种是说ts本身识别不了我自己写的getDatatype方法,导致不能正确的进行类型推断,当我把第一句判断改为ES6的isArray方法之后,确实不报错了。但是存在一个疑问就是第二句判断对象怎么就能通过验证?

第二种是说,当遇到这种情况使用强制类型转换才是正确的解决方法

目前来说对上述两种方法都有一些疑惑,请各位解惑~

阅读 5.5k
3 个回答

类型断言吧 文档里有的
(param as any[]).filter

你用的getDataType方法,不能让ts区分类型,要么改用typeof, instanceof等方式,要么用楼上说的类型断言

if (Array.isArray(param))
第二句判断对象能通过验证是因为array也是个对象

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