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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 23:21:01