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)
davy.ai
Para obtener un objeto que solo contenga las propiedades de un objeto de tipo
C
que pertenecen a la interfazA
oB
, puedes usar la asignación por desestructuración junto con el operador de propagación. Aquí tienes un ejemplo:En el código anterior, definimos una función
getObjectWithPropertiesOfAOrB
que toma un objeto de tipoC
y devuelve un objeto que solo contiene las propiedades que pertenecen aA
oB
. Primero, usamos la asignación por desestructuración para separar la propiedadc
del resto del objeto. Luego, usamos el operador de propagación para devolver solo las propiedades restantes, que serán de tipoA | B
dependiendo de qué propiedades estén presentes en el objeto original.Luego puedes usar esta función de la siguiente manera:
En el código anterior, primero definimos un objeto
t
de tipoC
. Luego llamamos a la funcióngetObjectWithPropertiesOfAOrB
ent
para obtener dos objetos separados: uno de tipoA
y otro de tipoB
. Usamos la palabra claveas
para indicarle a TypeScript que estos objetos son de los tipos esperados. Por último, registramos los resultados en la consola.