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

这篇具有很好参考价值的文章主要介绍了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种可用的解决方法:

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

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

吐槽

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

问题很直观, 也不复杂. 但看log, 这语法问题已经存在2个月了, 真的是vscode没装插件么?文章来源地址https://www.toymoban.com/news/detail-486371.html

到了这里,关于TS中, Array.reduce提示没有与此调用匹配的重载?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • solidity函数重载以及调用

    call调用重载方法查数据 send调用重载方法写数据 这款是自主研发的支持高并发multicall库 查数据 写数据 一个合约可以有多个同名但参数类型不同的函数。这个过程称为“重载”,也适用于继承的函数。下面的例子展示 f 了合约范围内函数的重载 A 。 外部接口中也存在重载函

    2024年02月09日
    浏览(42)
  • dedecms织梦模板用array调用多个自定义字段并判断的方法

    首页、列表页增加多字段判断 用[field:array runphp=\\\'yes\\\']标签,这个标签可以获取任意字段的值。 比如,有两个字段分别为:tishi,leibie,先判断 tishi 这个字段是否为空,同时判断 leibie 是否是指定字符,如果条件都满足,就只调用tishi字段内容,就可以这样写(和平时用的@me不

    2024年02月02日
    浏览(48)
  • ORA-28040:没有匹配的验证协议

    通过oracle客户端连接Oracle 12c的数据库,提示ORA-28040:没有匹配的验证协议 。 在服务器上登录正常 原因: oracle数据库为12c,使用客户端工具是11g版本,连接12c数据库时会报ora-28040错误。 在$ORACLE_HOME/network/admin/sqlnet.ora文件中添加: 重新启动 监听: 在11g的客户端连接正常。

    2024年02月11日
    浏览(49)
  • 【JAVA】方法的使用:方法语法、方法调用、方法重载、递归练习

    🍉内容专栏:【JAVA从0到入门】 🍉本文脉络:JAVA方法的使用,递归练习 🍉本文作者:Melon_西西 🍉发布时间 :2023.7.19 目录 1. 什么是方法(method) 2 方法定义 2.1 方法定义语法格式  例子:两个数相加 例子:判断某一年是否为闰年并调用判断函数  2.2 方法定义注意事项 3 方法

    2024年02月14日
    浏览(46)
  • 【Java基础篇】一文搞懂Java方法的调用与重载(超详细)

    个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【JavaSE_primary】 概念 :在Java中,方法是一段包含了一系列语句的可重用代码块。方法用于执行特定的任务或操作,并且可以带有输入参数和返回值。 方法的意义 :J

    2024年02月11日
    浏览(43)
  • vite vue3+ts @引入无提示/解决提示报错

    1. setting.json  这时候已经有提示了 但是ts会报错   tsconfig.json  以@开头代表src目录下 以#开头代表ts目录下  配置好后 重新引入 没有红色波浪线但是 vite不认识 @符号 运行项目还是会报错  这时候就需要在vite.config.ts中添加配置 如果path会报错 需要下载一下@types/node 再重启下

    2024年02月15日
    浏览(51)
  • C# 方法详解:定义、调用、参数、默认值、返回值、命名参数、方法重载全解析

    方法是一段代码,只有在调用时才会运行。 您可以将数据(称为参数)传递给方法。 方法用于执行某些操作,也被称为函数。 为什么使用方法?为了重用代码:定义一次代码,然后多次使用。 创建一个方法 方法的定义以方法的名称开头,后跟括号()。C#提供了一些预定义的

    2024年01月24日
    浏览(59)
  • VSCode 中,TS 提示 ”无法找到 *.vue 声明文件“ 的解决方案,ts(2307)

    github上找到的vue3-admin项目,下载后启动发现vscode总报错 需要配置tsconfig.json tsconfig.json配置 extends了tsconfig.base.json这个文件,其中有两项 这里记得修改成true,否则js中会报错 还有一点也容易忽略,在VSCode中需要设置 1、点击右下角 2、选择

    2024年02月14日
    浏览(45)
  • 电脑提示“由于仅部分匹配或匹配不明确,因此无法迁移设备”怎么办?

    “由于仅部分匹配或匹配不明确,因此无法迁移设备”错误可能会在将较旧的系统更新到较新的系统版本或者安装了双系统之后出现,此外,驱动程序不兼容、系统文件损坏、计算机接口故障、系统不支持出现错误的外接设备等也可能导致该错误出现。了解了无法迁移设备错

    2024年04月09日
    浏览(90)
  • ts报错“this“ 隐式具有类型 “any“,因为它没有类型注释。解决方案

    序         1、参考博文===》①严格模式 - 知乎,②ts的tsconfig.son中文说明③TypeScript Number | 菜鸟教程          2、解决( ts报错“this“ 隐式具有类型 “any“,因为它没有类型注释。 )           3、解决( 函数内this是undefined 的问题 )          4、解决( 其目标缺少构造

    2024年02月08日
    浏览(74)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包