TypeScript中如何修改扩展接口的属性类型并新增字段?
TypeScript 接口扩展的高效方案
不用新建重复属性的独立接口,TypeScript提供的类型工具可以组合出更便捷的扩展方式,完美适配你这种批量修改属性类型+新增字段的场景,而且能复用在多个类似需求中。
步骤1:定义通用类型工具
先封装两个可复用的类型工具,用来批量处理NullProp类型的转换:
type NullProp<Q> = Q | null | undefined; // 将NullProp<T>转换为T(去除null/undefined) type NonNullify<T> = T extends NullProp<infer U> ? U : T; // 批量将对象中指定属性转为非空类型 type NonNullifyKeys<Obj, Keys extends keyof Obj> = Omit<Obj, Keys> & { [K in Keys]: NonNullify<Obj[K]>; };
步骤2:生成目标接口
利用上面的工具,结合原有Request接口,快速生成DataRequest:
interface Request { Id: NullProp<number>, Name: NullProp<string>, Code: NullProp<string>, Type: NullProp<string>, ValueType: NullProp<string> // 其他原有属性 } // 先批量修改指定属性为非空,再合并新增字段 type DataRequest = NonNullifyKeys<Request, 'Id' | 'Name' | 'Code' | 'Type' | 'ValueType'> & { DataRequestId: number, DataRequestType: string, DataValueType: NullProp<string> };
进阶:全量转换属性类型
如果某个场景需要把原有接口的所有NullProp属性都转为非空,可以再封装一个全量转换的工具:
// 将对象中所有NullProp类型的属性转为非空 type NonNullifyAll<Obj> = { [K in keyof Obj]: NonNullify<Obj[K]>; }; // 用全量转换生成DataRequest的写法 type DataRequest = NonNullifyAll<Request> & { DataRequestId: number, DataRequestType: string, DataValueType: NullProp<string> };
方案优势
- 避免重复编写大量属性定义,只需要指定要修改的属性(或全量转换)
- 类型工具可以在多个接口扩展场景中复用,减少维护成本
- 保持代码的简洁性和一致性,符合DRY原则
内容的提问来源于stack exchange,提问作者user3711357
相关产品推荐
相关产品推荐

