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

TypeScript泛型计票类数值自增报ts(2356)错误如何解决

错误原因

这个TS报错的核心原因是泛型没有做类型约束:

  • 你定义的Votes<T>类中,_votos属性的值类型是完全无约束的泛型T,TS静态检查时无法确认T一定支持++自增运算——哪怕你实例化时传入了Votes<number>,类的内部逻辑需要兼容所有可能的T类型(比如T为string、boolean时自增逻辑完全非法),因此会直接抛出类型错误。
  • 你尝试的typeof value === 'number'判断无法解决问题,是因为你判断的是解构出来的临时变量value,TS不会将这个类型判断关联到this._votos[key]上,无法完成属性值的类型收窄。
可行修复方案

根据你是否需要保留泛型灵活性,二选一即可:

方案1:移除不必要的泛型(计票场景推荐)

如果这个类的作用就是做票数统计,存储的值永远是数字,直接移除泛型、明确值为number类型即可从根源消除错误,代码也更简洁:

const votos1 = {
  JavaScript: 0,
  Typescript: 0,
  Python: 0,
};

class Votes {
  constructor(private _votos: Record<string | number, number> = {}) {}

  checkEmpty(): boolean {
    return Object.keys(this._votos).length === 0;
  }

  showVotes(): void {
    for (const opcao in this._votos) {
      console.log(opcao + ' ' + this._votos[opcao]);
    }
  }

  vote(voteOption: string): void {
    if (!voteOption) {
      console.log('Digite a opção de voto desejada!');
      return;
    }
    // 处理投不存在选项的场景,避免出现NaN
    this._votos[voteOption] = (this._votos[voteOption] ?? 0) + 1;
  }
}

export const votacao1 = new Votes(votos1);
votacao1.vote('JavaScript');
votacao1.showVotes();

额外优化:新增选项默认初始化为0再加1,避免直接自增不存在的属性得到NaN。

方案2:保留泛型,添加类型约束

如果你需要这个类兼容bigint等其他可算术运算的类型,给泛型添加范围约束,同时在运算时做明确的类型收窄:

// 限定泛型只能为支持算术运算的类型
type CountType = number | bigint;

class Votes<T extends CountType> {
  constructor(private _votos: Record<string | number, T> = {}) {}

  checkEmpty(): boolean {
    return Object.keys(this._votos).length === 0;
  }

  showVotes(): void {
    for (const opcao in this._votos) {
      console.log(opcao + ' ' + this._votos[opcao]);
    }
  }

  vote(voteOption: string): void {
    if (!voteOption) {
      console.log('Digite a opção de voto desejada!');
      return;
    }
    const currentVal = this._votos[voteOption];
    if (typeof currentVal === 'number') {
      (this._votos[voteOption] as number) = (currentVal ?? 0) + 1;
    } else if (typeof currentVal === 'bigint') {
      (this._votos[voteOption] as bigint) = (currentVal ?? 0n) + 1n;
    }
  }
}

// 支持number类型计票
const votacao1 = new Votes<number>(votos1);
// 也支持bigint类型计票
const bigintVotacao = new Votes<bigint>();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 04:18:31