cómo podría validar que un objeto tiene todas las propiedades de una interfaz.
Por ejemplo:
interface Vehicle { name: string model: string } interface User { Name: string age: númber } interface Customer extends User { vehicles: Vehicle[] } ¿Cómo podría comprobar que un objeto tiene todas las propiedades de la interfaz del Customer ?
Si por "validar que un objeto tiene todas las propiedades de una interfaz" te refieres a la verificación de tipo estático , bueno, ese es el trabajo de Typescripts y lo hará en tiempo de compilación si intentas asignar el objeto a una variable de ese tipo de interfaz. p.ej:
const obj = {name: 'Edwin', age: 35} let c: Customer = obj // this will fail at compile time Typescript en tiempo de ejecución es solo Javascript, y Javascript no tiene un soporte de primera clase para interfaces. De hecho, Vehicle , User y Customer ni siquiera existirán en tiempo de ejecución debido al tipo de borrado . Para obtener más información, consulte esto y esto en el Manual y documentos de TypeScript. Por lo tanto, no puede hacer referencia a estos tipos en ninguna lógica de tiempo de ejecución. El operador instanceof de Javascript solo funciona para la herencia de prototipos de Javascript y tiene un significado muy específico:
El operador instanceof comprueba si la propiedad de prototipo de un constructor aparece en algún lugar de la cadena de prototipo de un objeto. El valor devuelto es un valor booleano.
El operador typeof de Javascript solo funciona para tipos primitivos, como string .
Si necesita realizar una "comprobación de tipos" en tiempo de ejecución, tendrá que hacerlo manualmente, comprobando la existencia de cada campo y su tipo de forma recursiva.
Typescript tiene algo de azúcar sintáctico para hacer que tales verificaciones manuales se vean naturales en su código fuente de Typescript. Lea acerca de las protecciones de tipo y estrechamiento .
Incluso puede haber una biblioteca que implemente eso para usted. De hecho, recuerdo haberme encontrado con una biblioteca que genera verificación de tipo en tiempo de ejecución basada en la definición de Typescript... Déjame encontrarlo muy rápido...
Algunos ejemplos (hay más):