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

