如何在TypeScript中合并接口实现DRY原则?避免重复定义
解决TypeScript接口重复定义的DRY方案
1. 合并重复的核心用户接口
你当前的Users和User接口字段完全一致,完全没必要重复定义。直接保留一个核心的User接口,需要用户数组时用User[]即可,无需单独定义Users接口。
重构后的核心接口文件(例如user.types.ts):
export interface User { id: number, name: string, username: string, email: string, address: Address, phone: string, website: string, company: Company } export interface Address { street: string, suite: string, city: string, zipcode: string, geo: Geo } export interface Geo { lat: string, lng: string } export interface Company { name: string, catchPhrase: string, bs: string, }
2. 复用字段定义UserData和UserResult
UserData和UserResult的字段来自User和Address的部分属性,用TypeScript内置工具类型**Pick和Partial**组合实现,避免重复编写字段:
Partial<T>:将T的所有字段转为可选类型Pick<T, K>:从T中挑选指定的K字段集合
重构后的衍生接口:
import { User, Address } from "./user.types"; // 从User和Address中挑选字段,转为可选类型 export type UserData = Partial<Pick<User, 'id' | 'email' | 'phone'> & Pick<Address, 'street' | 'zipcode' | 'city'>>; // 从User和Address中挑选字段,保持必填类型 export type UserResult = Pick<User, 'id' | 'email' | 'phone'> & Pick<Address, 'street' | 'zipcode' | 'city'>;
3. 额外优化建议
如果UserData用于提交请求的可选参数、UserResult用于响应返回的必填字段,上述写法已完全覆盖需求。后续扩展字段时,只需修改核心的User或Address接口,衍生类型会自动同步,彻底符合DRY原则。
方案优势
- 消除重复字段定义,降低维护成本:核心字段仅在一处定义,修改时无需多文件同步
- 利用TS内置工具类型,代码简洁且语义明确
- 保持类型系统一致性,避免重复定义导致的字段不一致问题
内容的提问来源于stack exchange,提问作者boogiehsows
相关产品推荐
相关产品推荐

