如何用TypeScript自动改写接口:将Record值类型包裹为Partial
TypeScript 自动将接口中 Record 的值转为 Partial 类型的实现方法
可以通过映射类型结合条件类型实现自动转换,无需手动逐个修改字段。
核心类型工具
先定义一个泛型类型,它会遍历原接口的所有属性,自动识别Record<string, T>类型的字段,并将其中的T替换为Partial<T>:
type WrapRecordValuesWithPartial<T> = { [K in keyof T]: T[K] extends Record<string, infer U> ? Record<string, Partial<U>> : T[K]; };
使用示例
假设你的基础类型和接口定义如下:
// 示例基础类型 type SomeType = { id: number; name: string; }; type SomeOtherType = { value: boolean; desc: string; }; // 原接口 export interface BaseInterface { foo?: Record<string, SomeType>; bar?: Record<string, SomeOtherType>; // 更多类似字段... }
只需要一行代码就能生成目标类型:
export type MyType = WrapRecordValuesWithPartial<BaseInterface>;
生成的MyType结构完全符合需求:
foo?: Record<string, Partial<SomeType>>bar?: Record<string, Partial<SomeOtherType>>- 其他非Record类型的字段保持原结构不变
原理说明
- 映射类型:
[K in keyof T]会遍历原类型的所有属性,自动保留原属性的可选性(?)、只读性(readonly)等修饰符,无需额外处理。 - 条件类型:
T[K] extends Record<string, infer U>判断当前属性值是否是Record<string, U>结构,通过infer U提取出Record的value类型U。 - 类型替换:如果匹配成功,就返回
Record<string, Partial<U>>,将原本的U包装成Partial<U>;不匹配则保持原类型不变。
扩展:处理嵌套Record
如果你的Record值内部还有嵌套的Record类型,可以把工具类型改成递归版本,实现深层转换:
type DeepWrapRecordValuesWithPartial<T> = { [K in keyof T]: T[K] extends Record<string, infer U> ? Record<string, Partial<DeepWrapRecordValuesWithPartial<U>>> : T[K]; };
内容的提问来源于stack exchange,提问作者Tofig Hasanov
相关产品推荐
相关产品推荐

