TypeScript如何实现泛型转换器 提取接口公共属性转为目标接口B
TypeScript 泛型转换器实现方案
1 基础类型定义与公共属性抽离
首先抽离复用的公共字段约束,后续调整公共属性只需修改一处即可:
// B接口固定公共属性 type BCommonFields = 'id' | 'version' // 目标接口B(如果你的项目要求definition是JSON类型,直接把Record<string, any>替换成JSON即可) interface B { id: string version: number definition: Record<string, any> }
2 泛型转换器实现
泛型约束要求所有源接口必须包含B的公共属性,编译阶段自动做合法性校验:
function convertToB<T extends Pick<B, BCommonFields>>(source: T): B { // 解构拆分公共属性 + 剩余非公共属性 const { id, version, ...rest } = source return { id, version, // 如果definition要求是JSON类型,改成 rest as unknown as JSON 即可 definition: rest } }
核心逻辑说明:
- 利用ES6对象解构语法自动归集所有非公共属性,不需要手动逐个枚举源接口的字段,天然支持任意符合约束的源接口
- 泛型约束在编译阶段就会拦截缺少
id/version属性的非法源对象,无需额外做运行时判断
3 测试验证
3.1 适配A1接口转换
interface userData { data: string status: string } interface A1 { id: string version: number data: userData createdBy: string } const interfaceA1Data: A1 = { id: '123abc', version: 1, data: { data: 'value', status: 'value' }, createdBy: 'me' } // 转换结果完全符合要求 const interfaceBData: B = convertToB(interfaceA1Data)
3.2 适配A2接口转换
interface valueType { type: string requester: string } interface A2 { id: string version: number value: valueType createdBy: string } const interfaceA2Data: A2 = { id: '456def', version: 2, value: { type: 'test', requester: 'user' }, createdBy: 'you' } const interfaceBData2: B = convertToB(interfaceA2Data)
内容的提问来源于stack exchange,提问作者venugopal
相关产品推荐
相关产品推荐

