Obtener propiedades de una clase usando Typescript

¿Hay alguna manera de obtener nombres de clase de propiedades en TypeScript: en el ejemplo me gustaría ‘describir’ la clase A o cualquier clase y obtener una matriz de sus propiedades (tal vez solo una pública?), ¿Es posible? ¿O debería crear una instancia del objeto primero?

class A { private a1; private a2; /** Getters and Setters */ } class Describer { toBeDescribed:E ; describe(): Array { /** * Do something with 'toBeDescribed' */ return ['a1', 'a2']; //<- Example } } let describer = new Describer(); let x= describer.describe(); /** x should be ['a1', 'a2'] */ 

Este código TypeScript

 class A { private a1; public a2; } 

comstack a este código JavaScript

 class A { } 

Esto se debe a que las propiedades en JavaScript comienzan a desaparecer solo después de que tienen algún valor. Tienes que asignar algún valor a las propiedades.

 class A { private a1 = ""; public a2 = ""; } 

se comstack para

 class A { constructor() { this.a1 = ""; this.a2 = ""; } } 

Aún así, no puede obtener las propiedades de una mera clase (puede obtener solo los métodos del prototipo). Debes crear una instancia. Luego obtienes las propiedades llamando a Object.getOwnPropertyNames() .

 let a = new A(); let array = return Object.getOwnPropertyNames(a); array[0] === "a1"; array[1] === "a2"; 

Aplicado a tu ejemplo

 class Describer { static describe(instance): Array { return Object.getOwnPropertyNames(instance); } } let a = new A(); let x = Describer.describe(a); 

Algunas respuestas están parcialmente equivocadas, y algunos hechos en ellas también están parcialmente equivocados.

Responda su pregunta: ¡Sí! Usted puede.

En typescript

 class A { private a1; private a2; } 

Genera el siguiente código en Javascript:

 var A = /** @class */ (function () { function A() { } return A; }()); 

como dijo @Erik_Cupal, podrías hacer lo siguiente:

 let a = new A(); let array = return Object.getOwnPropertyNames(a); 

Pero esto es incompleto . ¿Qué sucede si tu clase tiene un constructor personalizado? Necesitas hacer un truco con Typescript porque no comstackrá. Necesitas asignar como sea:

 let className:any = A; let a = new className();// the members will have value undefined 

Una solución general será:

 class A { private a1; private a2; constructor(a1:number, a2:string){ this.a1 = a1; this.a2 = a2; } } class Describer{ describeClass( typeOfClass:any){ let a = new typeOfClass(); let array = Object.getOwnPropertyNames(a); return array;//you can apply any filter here } } 

Para una mejor comprensión esto hará referencia dependiendo del contexto.

Solo por diversión

 class A { private a1 = void 0; private a2 = void 0; } class B extends A { private a3 = void 0; private a4 = void 0; } class C extends B { private a5 = void 0; private a6 = void 0; } class Describer { private static FRegEx = new RegExp(/(?:this\.)(.+?(?= ))/g); static describe(val: Function, parent = false): string[] { var result = []; if (parent) { var proto = Object.getPrototypeOf(val.prototype); if (proto) { result = result.concat(this.describe(proto.constructor, parent)); } } result = result.concat(val.toString().match(this.FRegEx) || []); return result; } } console.log(Describer.describe(A)); // ["this.a1", "this.a2"] console.log(Describer.describe(B)); // ["this.a3", "this.a4"] console.log(Describer.describe(C, true)); // ["this.a1", ..., "this.a6"] 

Actualización: si está utilizando constructores personalizados, esta funcionalidad se romperá.

Otra solución, puede simplemente iterar sobre las teclas de objeto como tal, primero debe crear una instancia del objeto:

 printTypeNames(obj: T) { const objectKeys = Object.keys(obj) as Array; for (let key of objectKeys) { console.Log('key:' + key); } } 
    Intereting Posts