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