TypeScript中使用.reduce()时,如何正确标注解构的currentValue类型?
问题场景
我有一个二维数组:
const input = [['A', 'X'], ['B', 'Y'], ...];
同时定义了两个枚举:
enum MyMove { Rock = 'X', Paper = 'Y', Scissors = 'Z', }; enum OpponentMove { Rock = 'A', Paper = 'B', Scissors = 'C', };
想要用Array.prototype.reduce()处理这个数组,但不知道如何正确标注回调函数中currentValue的类型。尝试了以下写法:
const score: number = input.reduce( (acc: number, ([opponentMove, myMove]: [OpponentMove, MyMove])) => {
结果出现了一堆错误:
02/index.ts:38:9 - error TS2322: Type 'string[]' is not assignable to type 'number'. 38 const score: number = input.reduce( ~~~~~ 02/index.ts:39:21 - error TS2304: Cannot find name 'opponentMove'. 39 (acc: number, ([opponentMove, myMove]: [OpponentMove, MyMove])) => { ~~~~~~~~~~~~ 02/index.ts:39:35 - error TS2304: Cannot find name 'myMove'. 39 (acc: number, ([opponentMove, myMove]: [OpponentMove, MyMove])) => { ~~~~~~ 02/index.ts:39:44 - error TS2554: Expected 1-2 arguments, but got 3. 39 (acc: number, ([opponentMove, myMove]: [OpponentMove, MyMove])) => { ~~~~~~~~~~~~~~~~~~~~~~
请问该如何正确标注[opponentMove, myMove]的类型?
解决方案
你的问题出在两个核心点:多余的外层括号和缺少reduce初始值,同时需要确保数组类型被正确识别。
1. 修正解构的类型标注写法
你给解构参数加了多余的外层括号,导致TypeScript误把解构的两个变量当成独立参数,引发"参数数量不匹配"和"变量未定义"的错误。正确的写法是直接在解构的数组参数上标注类型,不需要额外包裹括号:
(acc: number, [opponentMove, myMove]: [OpponentMove, MyMove]) => { // 你的计分逻辑 }
2. 给reduce提供初始值
第一个错误提示Type 'string[]' is not assignable to type 'number',是因为未指定初始值时,TypeScript会默认把数组第一个元素作为初始累加值,导致返回类型可能为string[],无法赋值给number类型的score。必须显式传入初始值0。
3. 确保input的类型正确(可选但推荐)
默认情况下input会被推断为string[][],和你定义的枚举类型不匹配。可以给input显式指定类型,让TypeScript提前做类型检查:
const input: [OpponentMove, MyMove][] = [['A', 'X'], ['B', 'Y'], ...];
完整正确代码
enum MyMove { Rock = 'X', Paper = 'Y', Scissors = 'Z', }; enum OpponentMove { Rock = 'A', Paper = 'B', Scissors = 'C', }; const input: [OpponentMove, MyMove][] = [['A', 'X'], ['B', 'Y']]; const score: number = input.reduce( (acc: number, [opponentMove, myMove]: [OpponentMove, MyMove]) => { // 示例计分逻辑:根据回合结果累加分数 let roundScore = 0; // 这里编写你的胜负判断与分数计算逻辑 return acc + roundScore; }, 0 // 初始累加值 );
内容的提问来源于stack exchange,提问作者neverendingqs
相关产品推荐
相关产品推荐

