不能。ESLint仅分析AST,不理解DDD语义,需将Aggregate、DomainEvent等约束转化为基于路径、命名、导入关系和类结构的可检测代码模式。
ESLint 能否直接检测 DDD 概念?
不能。ESLint 本身只分析 AST,不理解
、
、
这类业务语义。它只能识别语法结构(如类声明、函数调用、导入路径),无法判断一个类是否“应该”是值对象还是实体——这需要你把 DDD 约束翻译成可检测的代码模式。
如何把 DDD 规则转成 ESLint 可执行的规则
核心思路是:用文件路径 + 命名约定 + 导入关系 + 类声明结构,组合出可验证的契约。例如:
下的
文件,若导出类名以
结尾,必须继承自
(通过
AST 节点校验)
下的文件,导出的类必须实现
接口(检查
子句或类型断言)
中的文件,禁止直接
或
(用
+
正则匹配拦截)
中的类,必须是
且不含
构造函数以外的任何方法(遍历
,过滤掉
和
)
实际落地要绕开哪些坑
很多团队卡在第一步:写了个规则但没生效。常见原因包括:
Android开发代码规范 中文WORD版
本文档主要讲述的是Android开发代码规范;希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看
下载
插件未在
的
数组里注册,或未在
中显式启用(如
)
规则依赖路径解析,但项目用了
的
别名,ESLint 默认不处理——得配
并在
里指定
自定义规则里用
做字符串匹配,结果被 TypeScript 编译前的装饰器、泛型等干扰;应优先用 AST 节点类型和属性判断(如
)
VSCode ESLint 插件默认只校验打开的文件,而 DDD 层间越界常发生在未打开的
文件里——需确保
包含整个
,且
设为
或
为什么建议从 “层间依赖” 和 “命名空间约束” 入手
DDD 最容易违反、也最易自动化的就是这两类。比起强行校验“这个类是否符合聚合根生命周期”,不如先守住底线:
禁止
→
的反向 import(用
配置路径白名单)
强制
只能 import
和
(同上)
所有
下的类名必须含
后缀(用
自定义规则)
这些规则上线后,开发者立刻能感知到约束,后续再逐步叠加更细粒度的领域语义校验。别一上来就写
——AST 里根本找不到“不变量”的节点。
AggregateDomainEventRepositorysrc/domain/user/*.tsAggregateBaseAggregateClassDeclaration.superClasssrc/domain/**/events/DomainEventimplementssrc/infrastructure/persistence/importsrc/application/src/domain/ImportDeclarationsource.valuesrc/domain/**/value-objects/export classprivateClassBody.bodyConstructorMethodDefinition.eslintrc.jspluginsrules"my-ddd/no-domain-import-in-infrastructure": "error"tsconfig.jsonpathseslint-import-resolver-typescriptsettingsprojectcontext.getSourceCode().getText()node.type === 'ClassDeclaration'infrastructureeslint.workingDirectoriessrc/eslint.run"onSave""onType"domaininfrastructureno-restricted-importsapplication/use-casesdomainsharedsrc/domain/**/entities/Entityno-invalid-filenamevalidate-aggregate-invariants