Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

118
Vistas
Lectura de propiedades de una clase mecanografiada en tiempo de ejecución. Algo así como el reflejo en C# o en JAVA

Tengo un archivo .ts que contiene muchas clases como las siguientes (Proyecto Angular). Las clases se generan automáticamente a partir de clases de backend.

 export class User { name: string; lastName: number; userCode: string; }

Ahora, quiero leer esta clase y sus propiedades por su nombre. Luego crearé los elementos de entrada de Angular con estos datos.

Por ejemplo (pseudocódigo):

 let className = 'User'; let listOfProperties = reflectObject(className)
about 4 years ago · Juan Pablo Isaza
2 Respuestas
Responde la pregunta

0

Javascript es un lenguaje basado en prototipos, por lo que se diferencia de Java y C#, que se basan en clases. Necesita una instancia de la clase para obtener sus propiedades. Tampoco podrá leer ninguna propiedad que no haya sido instanciada.

Por lo tanto, las clases necesitarán valores predeterminados para todas las propiedades (cualquier valor servirá), luego deberá llamar al constructor de la clase y, finalmente, podrá leer sus propiedades.

eval() le permitirá ejecutar una cadena como javascript.

 // Any default value is fine export class User { name = ''; lastName = null; userCode = undefined; } let className = 'User'; let instance = eval('new ' + className + '()'); let properties = Object.getOwnPropertyNames(instance); console.log(properties); // Array(3) [ "name", "lastName", "userCode" ]

También puede memorizar las propiedades de un objeto.

 // Any default value is fine export class User { name = ''; lastName = null; userCode = undefined; } let classProperties: {[key: string]: string[]} = { 'User': Object.getOwnPropertyNames(new User()) }; let className = 'User'; let properties = classProperties[className]; console.log(properties); // Array(3) [ "name", "lastName", "userCode" ]

Lo bueno de este método es que puede llamar a Object.getOwnPropertyNames(classProperties) para obtener una lista de todas las clases válidas.


Si no puede proporcionar valores predeterminados para las propiedades, debe codificar los nombres de las propiedades. No hay forma de que JS sepa acerca de las propiedades que no existen, que yo sepa.

 let classProperties: {[key: string]: string[]} = { 'User': [ "name", "lastName", "userCode" ] }; let className = 'User'; let properties = classProperties[className]; console.log(properties); // Array(3) [ "name", "lastName", "userCode" ]

Aunque si las clases se generan automáticamente desde el backend (lo que sea que eso signifique), entonces creo que tendría más sentido que su backend proporcione una lista de propiedades.

about 4 years ago · Juan Pablo Isaza Denunciar

0

Como señaló Chris Hamilton, no hay forma de hacerlo en JavaScript/TypeScript nativo.

Pero puedes usar tst-reflect por ejemplo. Es un complemento de transformador de TypeScript que genera metadatos sobre tipos para uso en tiempo de ejecución y también tiene genéricos que funcionan.

Su ejemplo let listOfProperties = reflectObject(className) sería, por ejemplo.

 import { getType, Type } from 'tst-reflect'; class User { name = ''; lastName = null; userCode = undefined; } const userType: Type = getType<User>(); const listOfProperties = userType.getProperties().map(prop => `${prop.name}: ${prop.type.name}`);

Mira esta demostración en StackBlitz.

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda