我们仍然需要 DTO 吗?
发布: (2026年2月6日 GMT+8 03:21)
3 分钟阅读
原文: Dev.to
Source: Dev.to

什么是 DTO?
DTO(数据传输对象)是一种用于在层与层或系统之间传递数据的结构化对象。它通常用于:
- 验证来自后端的数据。
- 将后端响应转换为前端需要的形式。
- 解耦前端和后端的模式,以避免破坏性更改。
在传统的 REST API 中,DTO 很常见,因为响应可能包含额外字段、嵌套结构或前端不需要的数据。
GraphQL 如何改变游戏规则
GraphQL 允许客户端请求恰好所需的数据。这带来了几个影响:
- 细粒度查询 – 你在客户端查询中定义数据的形状,减少了将大响应映射到 DTO 的需求。
- 强类型 – GraphQL 模式是强类型的。像 Apollo Codegen 或 GraphQL Code Generator 之类的工具可以自动为你的查询和变更生成 TypeScript 类型。
- 灵活的前端演进 – 即使后端添加了额外字段,只要你没有查询它们,客户端也不会受到影响。DTO 不再充当防止破坏性更改的屏障。
何时仍可能需要 DTO
尽管 GraphQL 很强大,但在前端使用 DTO 仍有一些场景是有用的:
- 业务逻辑转换 – 计算新字段、格式化日期,或将多个查询合并为一个适合 UI 的对象。
- 验证或清理 – 在 UI 使用后端的可选或可空字段之前,强制执行更严格的规则。
- 长期项目的解耦 – 在大型团队中,DTO 可以将前端代码与后端模式的更改隔离,尤其是当后端被多个客户端共享时。
何时可能不需要 DTO
- 小型应用或 MVP – 映射到 DTO 的开销通常大于收益。
- 类型安全的 GraphQL 客户端 – 如果你使用带有生成类型的 TypeScript,你的类型已经充当了“实时 DTO”。
- 直接 UI 消费 – 如果你的组件可以直接消费 GraphQL 响应,添加 DTO 只会增加样板代码而收获不大。
旁注:仍有一些人倾向于将 DTO 作为整洁架构的一部分。你怎么看?