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

是否存在禁止直接判断数字真值的ESLint规则?

禁止对数字类型变量使用!variable检查的ESLint方案
  • 目前没有完全匹配需求的开箱即用ESLint规则,但可以通过两种方式实现目标:
  1. 利用@typescript-eslint/no-unnecessary-condition(仅部分场景生效)
    当变量类型为确定的number(非联合类型)时,该规则会提示!number是不必要的条件(因为0会被误判为假值);但如果变量是number | undefined这类联合类型,它会认为该条件具备必要性,不会触发提示。

  2. 自定义ESLint规则(完全覆盖需求)
    借助TypeScript的类型检查API,编写自定义规则来识别类型包含number的变量,当它们被!做逻辑取反时触发错误提示。

    核心实现逻辑:

    • 遍历AST中的一元表达式节点,筛选出操作符为!的节点
    • 获取表达式操作数的类型信息,判断是否包含number类型
    • 若符合条件,抛出错误并提示开发者使用精准判断方式

    示例规则代码片段:

    module.exports = {
      meta: {
        type: 'problem',
        docs: { description: '禁止对数字类型变量使用!检查,避免0被误判' },
        fixable: null,
        schema: []
      },
      create(context) {
        const parserServices = context.parserServices;
        const checker = parserServices.program.getTypeChecker();
    
        return {
          UnaryExpression(node) {
            if (node.operator !== '!') return;
            if (node.argument.type !== 'Identifier') return;
    
            const tsNode = parserServices.esTreeNodeToTSNodeMap.get(node.argument);
            const type = checker.getTypeAtLocation(tsNode);
            const hasNumberType = type.types?.some(t => t.flags & checker.TypeFlags.Number) || false;
    
            if (hasNumberType) {
              context.report({
                node,
                message: '禁止对数字类型变量使用!检查,0会被误判为假值,请改用精准判断(如xxx === undefined)'
              });
            }
          }
        };
      }
    };
    

推荐使用精准的判断方式替代!number,示例:

// 仅判断undefined
if (numberToCheck === undefined) {
  return "no number";
}

// 若需同时排除NaN
if (numberToCheck === undefined || Number.isNaN(numberToCheck)) {
  return "no number";
}

内容的提问来源于stack exchange,提问作者Vlad Furman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 04:35:23