Saltar al contenido

Convertir objeto a interfaz en TypeScript

Te doy la bienvenida a nuestro sitio, en este sitio encontrarás la solucíon que buscas.

Solución:

No hay conversión en javascript, por lo que no puede lanzar si “falla la conversión”.
Typescript admite la transmisión, pero eso es solo para el tiempo de compilación, y puede hacerlo así:

const toDo =  req.body;
// or
const toDo = req.body as IToDoDto;

Puede verificar en tiempo de ejecución si el valor es válido y, si no, arrojar un error, es decir:

function isToDoDto(obj: any): obj is IToDoDto 
    return typeof obj.description === "string" && typeof obj.status === "boolean";


@Post()
addToDo(@Response() res, @Request() req) 
    if (!isToDoDto(req.body)) 
        throw new Error("invalid request");
    

    const toDo = req.body as IToDoDto;
    this.toDoService.addToDo(toDo);
    return res.status(HttpStatus.CREATED).end();


Editar

Como señaló @huyz, no hay necesidad de la afirmación de tipo porque isToDoDto es un protector de tipo, por lo que esto debería ser suficiente:

if (!isToDoDto(req.body)) 
    throw new Error("invalid request");


this.toDoService.addToDo(req.body);

Aquí hay otra forma de forzar una conversión de tipo incluso entre tipos e interfaces incompatibles donde el compilador de TS normalmente se queja:

export function forceCast(input: any): T 

  // ... do runtime checks here

  // @ts-ignore <-- forces TS compiler to compile this as-is
  return input;

Luego puede usarlo para forzar la conversión de objetos a un cierto tipo:

import  forceCast  from './forceCast';

const randomObject: any = ;
const typedObject = forceCast(randomObject);

Tenga en cuenta que omití la parte en la que se supone que debe realizar comprobaciones de tiempo de ejecución antes de lanzar para reducir la complejidad. Lo que hago en mi proyecto es compilar todos mis .d.ts archivos de interfaz en esquemas JSON y usando ajv para validar en tiempo de ejecución.

Si ayuda a alguien, estaba teniendo un problema en el que quería tratar un objeto como otro tipo con una interfaz similar. Intenté lo siguiente:

no pasó la pelusa

const x = new Obj(a as b);

El linter se quejaba de que a faltaban propiedades que existían en b. En otras palabras, a tenía algunas propiedades y métodos de b, pero no todos. Para evitar esto, seguí la sugerencia de VS Code:

Pasó la pelusa y la prueba

const x = new Obj(a as unknown as b);

Tenga en cuenta que si su código intenta llamar a una de las propiedades que existen en el tipo b que no está implementado en el tipo adebe darse cuenta de un error de tiempo de ejecución.

valoraciones y comentarios

Si entiendes que ha sido útil este artículo, agradeceríamos que lo compartas con el resto juniors de esta forma nos ayudas a difundir este contenido.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *