TypeScript 工程基线
定位:TS 严格模式/类型收窄/枚举/路径别名/ESLint 门禁等工程基线。TS 工程方法论见技能 .claude/skills/dev-expert。
负面清单(Do Not)
- [禁止] 使用 any(用 unknown 收窄或明确类型);确有需要时须说明理由
- [禁止] 深层相对路径引用(超过两层必须用路径别名)
- [禁止] 运行时 enum(用 const 对象 + 联合类型,避免体积与双向映射问题)
- [禁止] 引入 NgRx/Redux 等重型状态库(规模不到不引入)
- [禁止] lint 未通过的代码进入提交
必须规则
- [必须] 严格模式:tsconfig 开启 strict(含 noImplicitAny、strictNullChecks 等全部严格项);后端同样开启。
- [必须] 类型命名:接口/类型用 XxxModel/XxxDto/XxxResponse 后缀;泛型参数单大写字母(T/K/V);禁止 I 前缀。
- [必须] 类型收窄:函数返回联合类型时用类型守卫收窄;禁止 as any 强转绕过类型检查(确需时注释理由)。
- [必须] 类型集中在 models:数据接口类型集中在 *.model.ts;前后端共享类型走 packages/shared,前端私有类型放 core/models;禁止在组件内定义重复数据结构。
- [必须] 枚举规范:用 const OBJECT = {...} as const + 联合类型 type X = typeof OBJECT[keyof typeof OBJECT];取值变化时同步登记文档。
- [必须] 路径别名:统一别名表(@shared/@core/@features/@server 等,以项目 tsconfig/jest 配置为准);引用超过两层相对路径必须改用别名。
- [必须] ESLint/Prettier 门禁:项目必须配置 ESLint(typescript-eslint + @angular-eslint + rxjs 规则)与 Prettier;配置收敛到 packages/config 共享包,各应用继承;提交前 lint 通过,CI 检查(若配置)。
- [必须] 状态管理选型:业务状态用 service + signal 即可;禁止引入 NgRx/Redux 等重型状态库(项目规模未达到引入阈值)。
- [必须] 异步类型安全:Promise/async 返回值显式标注;rxjs 类型完整(操作符与 subscribe 泛型正确)。
- [必须] 错误类型化:自定义错误类(AppError/ApiError)携带 code/message 类型,禁止 throw '字符串'。
建议规则
- [建议] 工具函数类型完备:shared/utils 下工具函数必须带完整参数与返回类型 + 简短 JSDoc(中文);通用逻辑才入 utils(≥2 处复用)。