You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular中def接口与dto接口的区别及使用场景

Def 与 DTO 接口的核心区别

两类文件是前端分层架构里的典型约定,本质定位完全不同:

  • Def(Definition 的缩写):前端内部维护的业务领域模型定义,是前端业务逻辑里通用的标准数据结构,完全服务于前端自身的业务、交互需求,不受后端接口结构变动的影响。
  • DTO(Data Transfer Object 的缩写):跨端数据传输专用结构,字段、嵌套层级100%对齐后端接口的入参、返回值规范,只在和后端交互的边界层使用,不会直接流入前端核心业务逻辑。

结合你提供的代码示例的具体说明

vendor-def.interface.ts 的典型特征

这个文件里的所有接口都服务于前端内部场景:

import { SourceType, VendorType } from '../shared/enums/vendor-type.enum';

export interface VendorDef {
  vendorId: string;
  companyCode: string;
  name: string;
  acronym: string;
  alias: string;
  legalId: string;
  vendorType: VendorType;
  sourceType: SourceType;
  fiscalCode: string;
}


export interface VendorFormDef {
  sourceType: SourceType;
  companyCode?: string;
  previousMainCompany?: string;
}

export interface InUsageDef {
  acronym: boolean;
  legalId: boolean;
  fiscalCode: boolean;
}
  • VendorDef是前端业务层对「供应商」这个实体的标准定义,是扁平的、业务可直接使用的结构,没有接口规范要求的冗余包装层,包含alias这类前端业务需要但后端接口不一定返回的字段。
  • VendorFormDef是前端表单组件绑定的数值结构,包含previousMainCompany这类纯前端交互流程才会用到的字段,后端不需要感知这个字段。
  • InUsageDef是前端做字段重复性校验时用的状态结构,完全属于前端内部逻辑,和后端接口没有关联。

vendor-dto.interface.ts 的典型特征

这个文件里的结构完全对齐后端接口规则:

import { SourceType, VendorType } from '../shared/enums/vendor-type.enum';

export interface VendorDto {
  data: VendorDataDto[] | VendorDataDto;
  errors?: VendorErrorsDto;
}

export interface VendorDataDto {
  attributes: VendorAttributesDto;
  id: string;
}

export interface VendorErrorsDto {
  code: string;
  title: string;
  detail: string;
}

export interface VendorCreateDto {
  companyCode: string;
  name: string;
  acronym: string;
  legalId: string;
  fiscalCode: string;
  vendorType: VendorType;
  sourceType: SourceType;
}
  • 最外层VendorDto包含data、errors字段,是典型的遵循JSON:API类规范的接口返回包装结构,业务逻辑不会直接使用这个嵌套结构。
  • VendorDataDto嵌套的attributes层也是接口规范强制要求的层级,不属于业务直接消费的扁平结构。
  • VendorCreateDto是调用创建供应商接口时的入参结构,字段和后端要求完全一一对应,没有前端独有的业务、交互字段。

使用选择规则

直接按场景判断即可,不需要纠结:

  • 用 DTO 的场景:
    • 定义后端接口的返回值接收类型
    • 定义发送给后端的接口请求入参类型

    注意:DTO 只允许出现在接口请求封装层(service/api 目录下的代码),拿到接口返回值后需要先把 DTO 转换成对应的 Def 结构,再传给状态管理、组件等业务逻辑层使用。

  • 用 Def 的场景:
    • 定义全局/页面状态管理中存储的业务实体结构
    • 定义组件传参(Props)、组件内部状态的类型
    • 定义表单、前端校验、交互逻辑等纯前端场景的数据结构

    注意:不要直接把 Def 结构作为请求参数传给后端,发请求前需要先把业务层的 Def 转换成后端要求的 DTO 结构再提交。

这种分层命名的核心作用是解耦前后端:后续如果后端调整接口结构、修改返回字段嵌套逻辑,你只需要修改 DTO 定义和对应的转换函数,不需要改动项目里所有和供应商业务相关的组件、逻辑代码。

内容的提问来源于stack exchange,提问作者Cluadia Hedda

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.02 04:42:34