javascript - Typescript - 如何处理两个接口(interface)之间的公共(public)属性?

标签 javascript typescript interface clone

我有一个接口(interface)A1和接口(interface)B,它们有一些共同的属性

interface A1 {
  id : string,
  version: number,
  data: userData,
  createdBy: string
}

interface userData {
  data: string,
  status: string
}

interface B {
  id : string,
  version: number,
  definition : JSON
}

所以,有一些属性,如 id、版本,在interfaceA1和interfaceB之间是通用的

我有一个类型为interfaceA的变量,其值如下

let interfaceA1Data: interfaceA1 = {
  id : '123abc',
  version: 1,
  data: {
    data: 'value',
    status: 'value'
  },
  createdBy: 'me'
}

我有另一个类型为interfaceB的变量,它刚刚被声明

let interfaceBData: interfaceB

现在我想将通用属性的值从interfaceA1Data复制到interfaceBData。非公共(public)属性应添加到定义属性中。因此,最终interfaceBData将保存以下值。

interfaceBData = {
  id : '123abc',
  version: 1,
  definition: {
    data: {
      data: 'value',
      status: 'value'
    },
    createdBy: 'me'
  }
}

如何在 typescript 中实现这一点?

变压器应该是通用的,比如如果我有一个interfaceA2,如何转换为interfaceB类型。在所有情况下,目标接口(interface)都是相同的,只是源接口(interface)不同。

interface A2 {
  id : string,
  version: number,
  value: valueType,
  createdBy: string
}

interface valueType {
  type: string,
  requester: string
}

最佳答案

如果两个接口(interface)之间有意重叠,则可能值得将公共(public)属性提取到单独的接口(interface)中。例如:

interface Versioned {
  id: string,
  version: number
}

interface userData {
  data: string,
  status: string
}

interface valueType {
  type: string,
  requester: string
}

interface A1 extends Versioned {
  data: userData,
  createdBy: string
}

interface A2 extends Versioned {
  value: valueType,
  createdBy: string
}

现在,您可以按照之前的方式继续创建“B”接口(interface),只需使用 definition 属性作为对象再次扩展 Versioned:

interface B extends Versioned {
  definition: Object
}

...但您可能希望通过将其转换为通用接口(interface)来提供额外的严格性,如下所示:

interface Serialized<T extends Versioned> extends Versioned {
  definition: Omit<T, keyof Versioned>
}

现在,您可以轻松地为任何扩展版本化的类型/接口(interface)编写转换器函数,将其转换为序列化的特定形状:

function transformer<T extends Versioned>(
{id, version, ...args}: T): Serialized<T> {
  return {
    id, version,
    definition: {...args}
  }
}

这是TS Playground link .

关于javascript - Typescript - 如何处理两个接口(interface)之间的公共(public)属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69008021/

相关文章:

javascript - Object.assign {} 和 Object.Assign [] 有区别吗

c# - 将 C++ COM 类转换为 C# 以供 C++ 可执行文件调用

javascript - 如何获得通过表单上传的文件的直接链接?

javascript - UglifyJS 'use strict' 语句

javascript - Spring-Boot Controller 无法识别来自 ajax 的数据

javascript - Nodejs/JavaScript 模块加载和引用

javascript - 如何处理 typescript 中的常量?

typescript - 混合联合类型、泛型和条件类型导致意外 "Type is not assignable to type"错误

string - 如何使用带界面的 Sscan

java - 实现实现接口(interface)的类的复制方法 - Java