|
|
@@ -386,19 +386,32 @@ export const CreateChannelSchema = z.object({
|
|
|
|
|
|
// 更新渠道DTO(所有字段可选)
|
|
|
export const UpdateChannelSchema = CreateChannelSchema.partial();
|
|
|
+```
|
|
|
+
|
|
|
+### 5.2 类型使用说明
|
|
|
+
|
|
|
+**重要**: Schema只用于请求参数验证和响应定义,**不需要导出推断的TypeScript类型**。
|
|
|
|
|
|
-// 类型推断
|
|
|
+```typescript
|
|
|
+// ❌ 不需要:导出推断类型(实际项目中不会被使用)
|
|
|
export type Channel = z.infer<typeof ChannelSchema>;
|
|
|
export type CreateChannelDto = z.infer<typeof CreateChannelSchema>;
|
|
|
export type UpdateChannelDto = z.infer<typeof UpdateChannelSchema>;
|
|
|
```
|
|
|
|
|
|
-### 5.2 关键要点
|
|
|
+**原因**:
|
|
|
+- UI包通过RPC直接从API路由推断类型
|
|
|
+- `@hono/zod-openapi` 自动生成OpenAPI文档
|
|
|
+- 前端使用 `hc.rpc()` 自动获得类型安全的客户端
|
|
|
+
|
|
|
+**正确做法**:只导出Schema常量,不导出推断类型。
|
|
|
+
|
|
|
+### 5.3 关键要点
|
|
|
|
|
|
- **使用 `.openapi()` 装饰器**: 添加描述和示例
|
|
|
- **使用 `z.coerce.date()`**: 处理日期字符串自动转换
|
|
|
- **使用 `.nullable().optional()`**: 处理可空字段
|
|
|
-- **类型推断导出**: 导出推断的TypeScript类型
|
|
|
+- **不导出推断类型**: 类型由RPC自动推断,不需要手动导出
|
|
|
|
|
|
## 6. 软删除规范
|
|
|
|
|
|
@@ -663,7 +676,7 @@ override async create(data: Partial<Channel>, userId?: string | number): Promise
|
|
|
- [ ] Service使用 `override` 关键字
|
|
|
- [ ] 软删除实现:使用 `status` 字段
|
|
|
- [ ] Schema使用 `.openapi()` 装饰器
|
|
|
-- [ ] 导出类型推断:`export type * = z.infer<typeof *Schema>`
|
|
|
+- [ ] Schema不导出推断类型(类型由RPC自动推断)
|
|
|
- [ ] 路由使用 `OpenAPIHono` 和 `AuthContext`
|
|
|
- [ ] 测试数据工厂使用时间戳保证唯一性
|
|
|
- [ ] vitest.config.ts 设置 `fileParallelism: false`
|