Tengo una interfaz A1 y una interfaz B con algunas propiedades en común.
interface A1 { id : string, version: number, data: userData, createdBy: string } interface userData { data: string, status: string } interface B { id : string, version: number, definition : JSON }Entonces, hay algunas propiedades como id, la versión es común entre la interfaz A1 y la interfaz B
Tengo una variable de tipo interfaceA con los siguientes valores
let interfaceA1Data: interfaceA1 = { id : '123abc', version: 1, data: { data: 'value', status: 'value' }, createdBy: 'me' }Tengo otra variable de tipo interfaceB, que se acaba de declarar
let interfaceBData: interfaceBAhora quiero copiar los valores de las propiedades comunes de interfaceA1Data a interfaceBData. Las propiedades no comunes deben agregarse a la propiedad de definición. Entonces, al final, interfaceBData tendrá los siguientes valores.
interfaceBData = { id : '123abc', version: 1, definition: { data: { data: 'value', status: 'value' }, createdBy: 'me' } }¿Cómo lograr esto en mecanografiado?
El transformador debe ser genérico, por ejemplo, si tengo una interfaz A2, cómo convertirlo al tipo de interfaz B. En todos los casos, la interfaz de destino es la misma, solo difiere la interfaz de origen.
interface A2 { id : string, version: number, value: valueType, createdBy: string } interface valueType { type: string, requester: string }Si hay una superposición intencional entre dos interfaces, podría valer la pena extraer propiedades comunes en una interfaz separada. Por ejemplo:
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 } Ahora, puede continuar con la creación de la interfaz 'B' de la misma manera que lo hizo antes, simplemente extendiendo Versionado una vez más con la propiedad de definition como Objeto:
interface B extends Versioned { definition: Object }... pero es posible que desee proporcionar un rigor adicional convirtiéndolo en una interfaz genérica, como esta:
interface Serialized<T extends Versioned> extends Versioned { definition: Omit<T, keyof Versioned> }Ahora puede escribir fácilmente una función de transformador para cualquier tipo/interfaz que extienda Versionado convirtiéndolo en una forma específica de Serializado:
function transformer<T extends Versioned>( {id, version, ...args}: T): Serialized<T> { return { id, version, definition: {...args} } }Aquí está el enlace de TS Playground .