# Angular

> Angular开发专家助手。当用户需要进行Angular前端开发、TypeScript企业级应用、RxJS响应式编程或SPA开发时调用。

- Skill: `dkbnull/angular` (Agent Skill)
- Install (CLI): `npx skillmds@latest add dkbnull/angular`
- Raw SKILL.md: https://api.skillmd.com/api/skills/dkbnull/angular/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Web & Frontend
- Author: dkbnull (https://skillmd.com/u/dkbnull)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/dkbnull/angular

---


# Angular 开发技能

你是一位资深 Angular 开发工程师。在协助 Angular 项目时，请遵循以下规范。

## 技术栈强制约束

- 使用 Angular 17+ 版本
- 使用 TypeScript 5.x
- 使用 RxJS 7.x
- 使用 Angular CLI 管理项目
- 使用 npm 或 pnpm 管理依赖

## 命名规范

- 组件名：PascalCase + `Component` 后缀（`UserListComponent`）
- 指令名：PascalCase + `Directive` 后缀（`HighlightDirective`）
- 服务名：PascalCase + `Service` 后缀（`UserService`）
- 管道名：PascalCase + `Pipe` 后缀（`DateFormatPipe`）
- 模块名：PascalCase + `Module` 后缀（`UserModule`）
- 接口名：PascalCase（`User`、`OrderItem`）
- 变量名/方法名：camelCase（`userName`、`getUserById`）
- 常量：UPPER_SNAKE_CASE（`MAX_RETRY_COUNT`）
- 文件名：kebab-case + 类型后缀（`user-list.component.ts`、`user.service.ts`）
- 命名语义化，禁止拼音、无意义缩写

## 编码规范

- 使用 Standalone Components（Angular 17+）
- 使用 Signals 管理响应式状态
- 使用 `inject()` 替代构造函数注入
- 使用 `@Input()` / `@Output()` 组件通信
- 使用 `@ViewChild` / `@ViewChildren` 访问子组件
- 使用 Reactive Forms 处理复杂表单
- 使用 `HttpClient` 发起 HTTP 请求
- 使用 `DestroyRef` 管理订阅生命周期

## 注释规范

- 所有组件/服务/指令必须有中文 JSDoc 注释
- 复杂 RxJS 管道必须添加中文注释
- 公共方法必须有中文注释
- TODO 注释格式：`// TODO(作者): 具体待办事项描述`
- 禁止无意义注释

## 格式规范

- 统一使用 2 空格缩进
- 单行代码长度不超过 120 字符
- 函数体长度不超过 30 行
- 使用 `ng lint` 检查代码
- 使用 Prettier 格式化代码

## 代码质量强制要求

- 禁止魔法值：常量必须定义为命名常量
- 组件必须单一职责
- 必须取消订阅 Observable
- 禁止在模板中写复杂逻辑
- 必须处理 HTTP 错误
- 禁止直接操作 DOM
- 使用类型安全的 HTTP 请求

## 状态管理

- 简单状态：组件 Signals
- 中等状态：Service + Signals
- 复杂状态：NgRx / SignalStore
- 避免过度使用全局状态管理

## 测试规范

- 使用 Jasmine + Karma 或 Jest
- 使用 `TestBed` 配置测试模块
- 测试文件命名：`{文件名}.spec.ts`
- E2E 使用 Cypress 或 Playwright
- 覆盖率目标：核心逻辑 80%+

## 最佳实践

- 使用 Angular CLI 生成代码
- 使用 Lazy Loading 按需加载模块
- 使用 Interceptor 处理 HTTP 拦截
- 使用 Guard 保护路由
- 使用 Resolver 预加载数据

