关于 quality-code
面向全栈 TypeScript 开发者的编码与审查指南,强调用类型表达有效状态、端到端传递类型,并采用真实服务测试和 OpenTelemetry。
主要功能
- 01用品牌类型和联合类型约束状态
- 02端到端共享并推导类型
- 03优先使用对象参数
- 04采用 Standard Schema 验证
- 05用真实服务进行测试
- 06以 OpenTelemetry 追踪观测
适用场景
- 01设计更难进入无效状态的 API
- 02减少客户端与服务端类型重复
- 03为共享验证逻辑接受通用 Schema
- 04测试数据库及本地云服务交互
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ rhyssullivan/ skills --skill quality-code安装后在 Claude Code 中输入/quality-code确认已加载。
详细介绍
编写高质量的全栈 TypeScript
编写或审查 TypeScript 代码时,请遵循以下原则。
让不可能的状态无法表示
利用类型系统,让无效状态在编译时就报错。可达状态越少,代码就越容易阅读和修改。
品牌类型
为基础类型添加品牌,避免它们混淆。在边界处验证一次;下游代码可以信任该类型。
type PhoneNumber = string & { __brand: "PhoneNumber" };
function parsePhone(input: string): PhoneNumber {
if (!/^\+?\d{10,15}$/.test(input)) throw new Error(`Invalid: ${input}`);
return input as PhoneNumber;
}
function sendSMS(to: PhoneNumber, body: string) {
/* input is trusted */
}
如果项目已经使用支持原生品牌类型的库(例如 Effect),请使用其基础类型,而不是自行实现。
优先使用可辨识联合类型,而非标志集合
// Don't — invalid combos representable
type State = { loading: boolean; user?: User; error?: string };
// Do — only valid states exist
type State =
| { status: "loading" }
| { status: "success"; user: User }
| { status: "error"; error: string };
让类型贯穿整个流程
数据库架构 → 服务端 → 客户端应共享类型,无需手动重复定义。使用项目已有的端到端类型工具(tRPC、oRPC、Elysia、TanStack Start 等)。标记为 Email 品牌类型的 users.email 到达客户端时也应保留该品牌类型。
不要重复声明可以推导出的类型。编写新接口前,先考虑使用 Pick、Omit、Parameters、ReturnType、Awaited、typeof 等。对于函数参数,应从源头推导,而不是手动指定类型:
// Don't — duplicate shape, drifts when the row changes
type UserSummary = { id: string; email: Email };
function renderUser(u: UserSummary) {
/* ... */
}
// Do — derive from the source of truth
type User = Awaited<ReturnType<typeof db.query.users.findFirst>>;
function renderUser(u: Pick<User, "id" | "email">) {
/* ... */
}
传递对象,而不是位置参数
// Don't — swap two args, still compiles
sendEmail("Welcome!", "Hi there");
// Do — order-independent, self-documenting
sendEmail({ to: "[email protected]", body: "Hi there" });
在对性能至关重要的热点路径中跳过此做法;其他情况下默认采用。
使用 Standard Schema 实现共享验证
对于不想选定某个验证器的库或代码,请接受 StandardSchemaV1<unknown, T>。
尽可能进行真实测试
能实际运行的东西就不要模拟。启动真实服务:
- 使用 LocalStack 测试 AWS
- 使用 Miniflare 测试 Cloudflare Workers
- 使用真实的 Postgres/SQLite(例如
bun:sqlite),而不是模拟数据库
仅模拟没有测试环境的第三方服务。
使用 OpenTelemetry,而不是打印日志
添加可观测性时,请使用 OTel span 进行埋点。首次有用户发送请求 ID 时,你就能直接找到答案,而不是靠猜测——这笔配置成本便物有所值。
评论
支持 Markdown