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

TypeScript定义防止除零类型时除法运算报错如何解决

TypeScript 除法运算类型报错2363解决思路

你遇到的报错翻译为:算术运算的右侧必须是 'any'、'number'、'bigint' 或枚举类型。(2363)

核心问题出在你对Omit工具类型的错误使用:

  • Omit是专门用于对象类型的工具,作用是剔除对象中指定的属性键,完全不支持处理number这类基本类型
  • 你写的Omit<number, 0>并不会得到「除0之外的数字」类型,反而会生成一个不符合数字类型要求的无效类型,因此TS不认可它可以参与算术运算

方案1:推荐:用 branded 类型实现类型安全的非零数字

这种方案既可以解决类型报错,还能从类型层面避免除0的运行时风险:

  1. 定义非零数字的 branded 类型和类型守卫
// 给number类型打标记,标识这是不等于0的数字
type NonZeroNumber = number & { __brand: 'NonZero' }

// 类型守卫:运行时校验值是否为非零数字,同时收窄类型
function isNonZero(n: number): n is NonZeroNumber {
  return n !== 0
}
  1. 替换你的NoZeroVariable定义
type Variable = {
    value: number
    resolve: () => number
}

type NoZeroVariable = {
    value: NonZeroNumber
    resolve: () => NonZeroNumber
}
  1. 构造NoZeroVariable实例时必须经过校验,保证值合法
function createNoZeroVariable(num: number): NoZeroVariable {
  if (!isNonZero(num)) {
    throw new Error('非零变量不能传入0值')
  }
  return {
    value: num,
    resolve: () => num
  }
}

完成改造后再执行a.resolve() / b.resolve()就不会触发类型报错了。


方案2:临时绕开(不推荐)

如果只是临时调试不想修改类型定义,可以手动加类型断言告诉TS这个值是合法数字:

a.resolve() / (b.resolve() as number)

这种方式会丢失类型安全校验,无法避免运行时出现除0问题。

内容的提问来源于stack exchange,提问作者Rémi Bernard

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 19:15:03