es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo filtrar las propiedades de un objeto por una interfaz

Digamos que tenemos dos interfaces definidas de la siguiente manera:

interface A {
  a: string;
  b: number;
  c: Array<number>;
}

interface B {
  x: number;
  y: number;
  z: number;
}

Y otro tipo definido así:

type C = A & B;

o

interface C extends A, B {}

¿Cómo puedo obtener un objeto que solo contenga las propiedades de un objeto de tipo C que pertenezcan a la interfaz A o B?

Lo siguiente no funciona:

function f(o: C) {
  const a = o as A;
  const b = o as B;

  console.log("A:", a);
  console.log("B:", b);
}

Pero si funcionara, la salida del siguiente código sería:

const t: C = {
  a: "Test",
  b: 1,
  c: [0, 1],
  x: 1,
  y: 1,
  z: 0,
};

f(t);

Sería:

A: { a: "Test", b: 1, [0, 1] }
B: { x: 1, y: 1, z: 0 }

¿Es posible hacer lo que necesito?

Quizás algo como esto:

const a = { ...A } = o;

(Lo cual, obviamente, tampoco funciona, ni siquiera compilaría)

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para obtener un objeto que solo contenga las propiedades de un objeto de tipo C que pertenecen a la interfaz A o B, puedes usar la asignación por desestructuración junto con el operador de propagación. Aquí tienes un ejemplo:

    function getObjectWithPropertiesOfAOrB(obj: C): A | B {
      const { c, ...rest } = obj;
      return rest;
    }
    

    En el código anterior, definimos una función getObjectWithPropertiesOfAOrB que toma un objeto de tipo C y devuelve un objeto que solo contiene las propiedades que pertenecen a A o B. Primero, usamos la asignación por desestructuración para separar la propiedad c del resto del objeto. Luego, usamos el operador de propagación para devolver solo las propiedades restantes, que serán de tipo A | B dependiendo de qué propiedades estén presentes en el objeto original.

    Luego puedes usar esta función de la siguiente manera:

    const t: C = {
      a: "Test",
      b: 1,
      c: [0, 1],
      x: 1,
      y: 1,
      z: 0,
    };
    
    const resultA = getObjectWithPropertiesOfAOrB(t) as A;
    const resultB = getObjectWithPropertiesOfAOrB(t) as B;
    
    console.log("A:", resultA); // {a: "Test", b: 1}
    console.log("B:", resultB); // {x: 1, y: 1, z: 0}
    

    En el código anterior, primero definimos un objeto t de tipo C. Luego llamamos a la función getObjectWithPropertiesOfAOrB en t para obtener dos objetos separados: uno de tipo A y otro de tipo B. Usamos la palabra clave as para indicarle a TypeScript que estos objetos son de los tipos esperados. Por último, registramos los resultados en la consola.

Comments are closed.