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
相关产品推荐
相关产品推荐

