TS中, Array.reduce提示沒有與此調用匹配的重載?

来源:https://www.cnblogs.com/lin-xii/archive/2023/06/16/ts-zhong-arrayreduce-ti-shi-mei-you-yu-ci-diao-yon.html
-Advertisement-
Play Games

起因 一個feature開發, 結果需求評審、工時預估, 簡直是事故級別的. 最後, 迫於無奈, 全組人都得上去救火... 今天, 幫忙改bug的時候, 發現新checkout下來的代碼, 還帶著新鮮的語法錯誤...簡直大無語. 翻了遍代碼, 發現很多地方都存在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沒裝插件麽?

本文來自博客園,作者:林十二XII

轉載請註明原文鏈接:https://www.cnblogs.com/lin-xii/p/ts-zhong-arrayreduce-ti-shi-mei-you-yu-ci-diao-yon.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 摘要:華為全球智慧金融峰會2023上,華為雲資料庫服務產品部總經理蘇光牛帶來了《華為雲分散式資料庫GaussDB,做金融數字化的堅實數據底座》的主題分享。 6月7日,華為全球智慧金融峰會2023在上海順利舉行,華為雲資料庫服務產品部總經理蘇光牛帶來了《華為雲分散式資料庫GaussDB,做金融數字化的 ...
  • 查看資料庫 show databases; 創建資料庫 create database db1; 創建資料庫db1 刪除資料庫 drop database db1; 刪除資料庫db1 切換進入資料庫 use user 進入user資料庫 查看資料庫中的表 show tables; 創建表 創建表的方 ...
  • Hello,社區的小伙伴們,又到了每月版本發佈時間。🎉🎉🎉 本次社區版更新帶來了新功能 **「發佈變更」**,以及**內置脫敏規則、授權粒度細化、連接池管理、變更鏈接密鑰**等,信息量不少,一起來看! ### 發佈變更 大量數據變更的便捷操作 社區版 v2.0.0,我們增加了「數據變更」模塊, ...
  • > 上一篇文章從理論上對Kotlin協程進行了部分說明,本文將在上一篇的基礎上,從實戰出發,繼續協程之旅。 ### 從源頭說起 在Kotlin中,要想使用協程,首先需要使用協程創建器創建,但還有個前提——協程作用域(`CoroutineScope`)。在早期的Kotlin實現中,協程創建器是一等函數 ...
  • > 上一篇文章,我介紹了Kotlin協程的創建,使用,協作等內容。本篇將引入更多的使用場景,繼續帶你走進協程世界。 ### 使用協程處理非同步數據流 常用編程語言都會內置對同一類型不同對象的數據集表示,我們通常稱之為容器類。不同的容器類適用於不同的使用場景。Kotlin的`Flow`就是在非同步計算的需 ...
  • “聊技術無話不談,一起來吹吹元服務!暢聊你對元服務的想法,說不定,你就能撬動元服務的爆發增長!” 元服務(即原子化服務)是華為“輕量化”服務的新物種,可提供全新的服務和交互方式,讓應用化繁為簡,讓服務觸手可及!基於鴻蒙萬能卡片,元服務可實現應用功能在桌面“永遠打開”,實現智能推薦、服務直達! 而在元 ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 npm包:sta-datepicker 效果圖 需求 普通的時間選擇器要麼只能單選,要麼只能選範圍,不可以隨意選擇若幹個時間,同時大多數現成的時間選擇器選擇結束會收起來,很不方便。現在需求如下 1、可以自己控制展開收起 2、可以選擇不連續 ...
  • ##正則表達式規則 | 表達式 | 描述 | | | | | [0-9] | 查找任何從 0 至 9 的數字。例如,匹配: '111' ,不匹配:'eee' | | [abc] | 查找方括弧之間的任何字元。例如,/[123]/ 匹配 "1234567" 中的 "123","1" 中的 "1"。但是 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...