You need to enable JavaScript to run this app. TypeScript如何将Array.prototype.reduce返回类型改为string[]?
优惠活动
大模型
产品
解决方案
定价
更多

TypeScript如何将Array.prototype.reduce返回类型改为string[]?

问题本质

TypeScript 对数组reduce方法的默认推断逻辑,和你的实际使用方式不匹配:

  • 当调用reduce时既不手动传入泛型参数、也不传入第二参数(累积器初始值),TS会默认把累积值的类型锁定为原数组的元素类型,也就是这里的CustomObject,自然会对返回string[]的回调抛出类型不匹配错误
  • 单独给testArray标注string[]类型不生效的原因是:TS会优先检查reduce方法本身的类型合法性,当reduce内部的回调返回值和默认推断的累积值类型不匹配时,会直接在reduce调用位置报错,根本不会走到“reduce返回值能否赋值给testArray”的后续校验环节

另外你当前的代码写法还存在运行时隐患:没有传初始值的reduce,如果遇到空的arrayOfObjects,会直接抛出运行时错误。

解决方式

  • 显式给reduce指定累积器的泛型类型,同时传入初始值
    这是最贴合你现有代码逻辑的改法,直接明确告知TS:本次reduce的累积值类型不是原数组的CustomObject,而是string[]
    const testArray = arrayOfObjects.reduce<string[]>(
      (prev, current) => prev.concat(current.stringArray),
      [] as string[] // 传入空字符串数组作为累积器的起始值
    );
    
  • 换用语义更匹配的内置方法实现相同逻辑
    你的场景本质是提取每个对象的stringArray字段再做扁平化拼接,使用flatMap可以完全规避手动处理reduce泛型的问题,TS会自动正确推导返回值为string[],代码可读性也更强:
    const testArray = arrayOfObjects.flatMap(item => item.stringArray);
    

内容的提问来源于stack exchange,提问作者lorless

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.06 16:06:01