这篇文章主要为大家介绍了TS中Array.reduce提示没有与此调用匹配的重载解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
一个feature开发, 结果需求评审、工时预估, 简直是事故级别的. 最后, 迫于无奈, 全组人都得上去救火...
// 业务代码不方便外流, 简单写了个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重载匹配的资料请关注脚本之家其它相关文章!
您可能感兴趣的文章:
数据结构TypeScript之链表实现详解2023-01-01
使用typeScript 进行扁平化数据转树实现demo2023-06-06
TypeScript 高级数据类型实例详解2023-01-01
详解Typescript 严格模式有多严格2023-01-01
layui中的layer弹出层自定义样式更改背景2023-01-01
使用typeScript 进行扁平化数据转树实现demo2023-01-01
CesiumJS源码杂谈之从光到 Uniform2023-01-01
Typescript使用装饰器实现接口字段映射与Mock实例2023-01-01
美国设下计谋,用娘炮文化重塑日本,已影响至中国2021-11-19
时空伴随者是什么意思?时空伴随者介绍2021-11-09
工信部称网盘企业免费用户最低速率应满足基本下载需求,天翼云盘回应:坚决支持,始终2021-11-05
2022年放假安排出炉:五一连休5天 2022年所有节日一览表2021-10-26
电脑版 - 返回首页
2006-2024 脚本之家 JB51.Net , All Rights Reserved.
苏ICP备14036222号