为何@typescript-eslint/naming-convention将类识别为变量?如何修复?
问题根因
@typescript-eslint/naming-convention基于静态代码分析做命名校验,存在能力边界:规则内置的class选择器仅能匹配直接通过class关键字声明的类标识符,不会跨函数调用、异步逻辑做全链路类型追踪,因此从异步函数返回值中解构得到的类,会被判定为普通变量,匹配默认的camelCase校验规则触发报错。
报错场景复现代码:
class BarClass { } const geClass = async() => { return { BarClass }; } (async () => { // 此处解构的BarClass会被误判为普通变量 const { BarClass } = await geClass(); })();
触发的报错信息:
Variable name
BarClassmust match one of the following formats: camelCase 12:11 - 12:19
原有规则配置:
{ "rules": { "@typescript-eslint/naming-convention": [ "error", { "selector": ["default"], "format": ["camelCase"] }, { "selector": ["class", "objectLiteralProperty"], "format": null } ] } }
修复方案
方案1:补充规则配置(推荐)
新增一条针对const声明的函数类型变量的规则,允许这类变量使用PascalCase命名。类本质是构造函数,该配置不会破坏普通变量的camelCase约束,同时能完美兼容解构获取类的场景:
{ "rules": { "@typescript-eslint/naming-convention": [ "error", { "selector": "default", "format": ["camelCase"] }, { "selector": ["class", "objectLiteralProperty"], "format": null }, // 新增以下规则 { "selector": "variable", "modifiers": ["const"], "types": ["function"], "format": ["camelCase", "PascalCase"] } ] } }
方案2:行内注释忽略(仅适合个别特殊场景)
如果只是极少数场景需要解构类,不想调整全局规则,可以在报错行上方添加注释临时跳过该行校验:
(async () => { // eslint-disable-next-line @typescript-eslint/naming-convention const { BarClass } = await geClass(); })();
注意:该方案不要大规模使用,否则会大幅削弱命名规范的约束效力。
内容的提问来源于stack exchange,提问作者Jon Sud
相关产品推荐
相关产品推荐

