¿Es posible obtener el nombre de clase / tipo de un objeto en tiempo de ejecución usando TypeScript?
class MyClass{}
var instance = new MyClass();
console.log(instance.????); // Should output "MyClass"
typescript
Adam Mills
fuente
fuente
Respuestas:
Respuesta simple:
Sin embargo: tenga en cuenta que es probable que el nombre sea diferente al usar código minificado.
fuente
let instance: any = this.constructor; console.log(instance.name);
any
esconsole.log(instance.constructor['name']);
interface Function { name: string; }
esto ampliará la definición "nativa".MyClass.name
no funcionará bien si está minimizando su código. Porque minimizará el nombre de la clase.Sé que llego tarde a la fiesta, pero creo que esto también funciona.
Alternativamente...
El código anterior obtiene todo el código del constructor como una cadena y aplica una expresión regular para obtener todas las 'palabras'. La primera palabra debe ser 'función' y la segunda palabra debe ser el nombre de la clase.
Espero que esto ayude.
fuente
Mi solución no fue confiar en el nombre de la clase. object.constructor.name funciona en teoría. Pero si está usando TypeScript en algo como Ionic, tan pronto como vaya a producción, se incendiará porque el modo de producción de Ionic minimiza el código Javascript. Entonces las clases reciben nombres como "a" y "e".
Lo que terminé haciendo fue tener una clase typeName en todos mis objetos a los que el constructor asigna el nombre de la clase. Entonces:
Sí, eso no fue lo que se preguntó, realmente. Pero usar el constructor.name en algo que podría minimizarse en el futuro es solo un dolor de cabeza.
fuente
Ver esta cuestión .
Dado que TypeScript está compilado en JavaScript, en tiempo de ejecución está ejecutando JavaScript, por lo que se aplicarán las mismas reglas.
fuente
Primero debe convertir la instancia en
any
porqueFunction
la definición de tipo no tiene unaname
propiedad.Actualizar:
Con TypeScript 2.4 (y potencialmente anterior) el código puede ser aún más limpio:
fuente
Property 'name' does not exist on type 'Function'.
(this as {}).constructor.name
o(this as object).constructor.name
es mejor queany
porque entonces realmente obtienes autocompletar :-)En Angular2 esto puede ayudar a obtener el nombre de los componentes:
comp: se necesita cualquiera porque la compilación de TypeScript emitirá errores, ya que la función inicialmente no tiene un nombre de propiedad.
fuente
element.nativeElement
: en una directiva, puede obtener el nombre del componente como este@Optional() element: ElementRef<HTMLElement>
y luego usarif (element != null && element.nativeElement.tagName.startsWith('APP-')) { this.name = element.nativeElement.tagName; }
El código completo de TypeScript
fuente
myClass.prototype.constructor.name
.myClass.constructor.name
tuve el error TypeScript:error TS2339: Property 'name' does not exist on type 'Function'
.fuente
Esta solución funciona después de la uglificación de minificación, pero requiere decorar las clases con metadatos.
Utilizamos la generación de código para decorar nuestras clases de entidad con metadatos de la siguiente manera:
Luego consumir con el siguiente ayudante:
fuente
Si ya sabe qué tipos esperar (por ejemplo, cuando un método devuelve un tipo de unión ), puede usar protectores de tipo.
Por ejemplo, para los tipos primitivos puede usar un tipo de protección :
Para tipos complejos puede usar una instancia de guardia :
fuente