TS中Array.reduce提示没有与此调用匹配的重载解析

 更新时间:2023年06月19日 10:28:48   作者:wlAlter  
这篇文章主要为大家介绍了TS中Array.reduce提示没有与此调用匹配的重载解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

起因

一个feature开发, 结果需求评审、工时预估, 简直是事故级别的. 最后, 迫于无奈, 全组人都得上去救火...

今天, 帮忙改bug的时候, 发现新checkout下来的代码, 还带着新鲜的语法错误...简直大无语.

翻了遍代码, 发现很多地方都存在Array.reduce类型重载相关的问题, 简单记录一下解决过程.

排查过程

大家的vscode都不装语法提示插件么? 代码挂着红线, 就扔代码库了??? 抽时间, 得把hook安排上了🙄

// 业务代码不方便外流, 简单写了个demo, 问题原因相同
const nums = [1, 2, 3, 4, 5];
const sum = nums.reduce((pre, cur) => {
  return [...pre, { count: cur }];
}, []);
sum.push({ count: 6 });
console.log(sum);
// 这段代码, 编译成.js后, 其实是可以运行的. 但如果装了插件, 可以看到明显的TS语法错误..
// 输出值
// [
//   { count: 0 },
//   { count: 1 },
//   { count: 2 },
//   { count: 3 },
//   { count: 4 },
//   { count: 5 },
//   { count: 6 }
// ]

(pre, cur)=>{} 会提示没有对应的重载类型. 原因不复杂, 就是类型不符合推导预期, 但为什么不符合预期, 还真没仔细看过. 本着fixbug可以, 但不能一无所获的思想, 查看了对应的TS类型声明

// 3种reduce的类型声明
reduce(callbackfn: (previousValue: T, currentValue: T, currentIndex: number, array: T[]) => T): T;
reduce(callbackfn: (previousValue: T, currentValue: T, currentIndex: number, array: T[]) => T, initialValue: T): T;
reduce<U>(callbackfn: (previousValue: U, currentValue: T, currentIndex: number, array: T[]) => U, initialValue: U): U;

很明显, reduce对类型的推导, 基本就是, 「参数类型」和「返回值类型」相同、且reduce前后, 只有一种类型, 那不用加「泛型」

但是, 如果出现1种以上的类型, 且preValue与initValue、returnType类型不同, 就必须显式标注类型.

案例中, pre的类型为never[], cur的类型是number, 而reduce的返回值类型是Array<{ count: number }>. 根据之前推导的结论, 出现3种类型, 且pre与cur、return值类型不同, 必须显式声明类型.

根据TS的类型声明, 有2种可用的解决方法:

  • 给initValue增加类型断言, [] as Array<{ count: number }>.
  • 在reduce处, 声明泛型类型nums.reduce<Array<{ count: number }>>

核心解决思路: 减少TSC推导类型的种类, 促使其符合已存在的类型定义.

吐槽

只要思想不滑坡, 办法总比困难多

问题很直观, 也不复杂. 但看log, 这语法问题已经存在2个月了, 真的是vscode没装插件么?

以上就是TS中Array.reduce提示没有与此调用匹配的重载解析的详细内容,更多关于TS Array.reduce重载匹配的资料请关注脚本之家其它相关文章!

相关文章

  • layui中的layer弹出层自定义样式更改背景

    layui中的layer弹出层自定义样式更改背景

    layui中的layer弹出层有很多提示框,但是我们使用最多的应该就几种,layer.msg、layer.alert、layer.open、layer.load等。layer 有内置的skin:layui-layer-lan,layui-layer-molv,可以直接使用。skin不仅允许你传入layer内置的样式class名,可以自定义class名。
    2023-06-06
  • js库Modernizr的介绍和使用

    js库Modernizr的介绍和使用

    Modernizr是一个开源的JS库,它使得那些基于访客浏览器的不同(指对新标准支持性的差异)而开发不同级别体验的设计师的工作变得更为简单
    2015-05-05
  • 鲜为人知的JavaScript5个JSON秘密功能

    鲜为人知的JavaScript5个JSON秘密功能

    这篇文章主要为大家介绍了鲜为人知的JavaScript中5个JSON秘密功能详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-06-06
  • 数据结构TypeScript之邻接表实现示例详解

    数据结构TypeScript之邻接表实现示例详解

    这篇文章主要为大家介绍了数据结构TypeScript之邻接表实现示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • 使用JS 的download库在浏览器直接下载文件

    使用JS 的download库在浏览器直接下载文件

    一般情况下web项目的浏览器下载文件,都是使用form表单或者ajax向后端提交数据,发送请求,后端文件的URL地址或者二进制文件流。这篇文章主要介绍了使用JS 的download库在浏览器直接下载文件。
    2022-12-12
  • 移动设备web开发首选框架:zeptojs介绍

    移动设备web开发首选框架:zeptojs介绍

    这篇文章主要介绍了移动设备web开发首选框架:zeptojs介绍,他兼容jquery的API,所以学起来或用起来并不吃力,需要的朋友可以参考下
    2015-01-01
  • 联合类型Union Types与交叉类型Intersection Types区别解析

    联合类型Union Types与交叉类型Intersection Types区别解析

    这篇文章主要为大家介绍了联合类型Union Types与交叉类型Intersection Types区别详解
    2023-06-06
  • 前端轻量级MVC框架CanJS详解

    前端轻量级MVC框架CanJS详解

    你可能听说了这个新MVC框架: CanJS。还有什么比用它来创建一个联系人Web App更能深入了解它的办法呢?当看完这篇教程,你将全面了解用它的什么工具来创建你自己的Web App。
    2014-09-09
  • TypeScript前端上传文件到MinIO示例详解

    TypeScript前端上传文件到MinIO示例详解

    这篇文章主要为大家介绍了TypeScript前端上传文件到MinIO示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • TypeScript 基本数据类型实例详解

    TypeScript 基本数据类型实例详解

    这篇文章主要为大家介绍了TypeScript 基本数据类型实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01

最新评论