You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 13:55:11