是否存在禁止直接判断数字真值的ESLint规则?
禁止对数字类型变量使用
!variable检查的ESLint方案 - 目前没有完全匹配需求的开箱即用ESLint规则,但可以通过两种方式实现目标:
利用
@typescript-eslint/no-unnecessary-condition(仅部分场景生效)
当变量类型为确定的number(非联合类型)时,该规则会提示!number是不必要的条件(因为0会被误判为假值);但如果变量是number | undefined这类联合类型,它会认为该条件具备必要性,不会触发提示。自定义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)' }); } } }; } };- 遍历AST中的一元表达式节点,筛选出操作符为
推荐使用精准的判断方式替代!number,示例:
// 仅判断undefined if (numberToCheck === undefined) { return "no number"; } // 若需同时排除NaN if (numberToCheck === undefined || Number.isNaN(numberToCheck)) { return "no number"; }
内容的提问来源于stack exchange,提问作者Vlad Furman
相关产品推荐
相关产品推荐

