Búsqueda de sitios web

TypeScript convertir subtipo a supertipo y eliminar campos extra


Si tuviéramos estos tipos:

interface Person {
  name: string;
}
interface Agent extends Person {
  code: number;
}

y tener este código:

const agent: Agent = {
  name: 'name',
  code: 123
}

¿Cómo convertirías el tipo Agent en Person y eliminarías el campo de código? Cuando intento hacer esto:

const person: Person = agent as Person
console.log(person) // Still contains the fields of agent

Este es un ejemplo simple, pero en mi caso de uso real el objeto tiene muchos más campos. También he intentado:

person: Person = {
...agent
}

Otro artículo que revisé y que no funcionó para mi caso: Restringir el tipo por superclase en la interfaz.

Respuesta #1

El 'casting' no significa que el valor real dentro de lo que se convierte vaya a cambiar. Es para que el desarrollador le diga a TypeScript 'confía en mí en esto, sé lo que hay dentro'. Tiene sentido solo durante el desarrollo, no en tiempo de ejecución.

Para la parte de desarrollo, tal vez los Tipos de Utilidad sean útiles. Podrías hacer, por ejemplo, algo así (si quieres mantener algunos campos de Agent dentro de Person):

type Person = Pick<Agent, "name"|"address">;

Artículos relacionados