在TypeScript中运行时获取对象的类名

是否有可能在运行时使用打字机获取对象的类/types名称?

class MyClass{} var instance = new MyClass(); console.log(instance.????); // Should output "MyClass" 

简单的回答:

 class MyClass {} const instance = new MyClass(); console.log(instance.constructor.name); // MyClass console.log(MyClass.name); // MyClass 

看到这个问题 。

由于TypeScript被编译为JavaScript,因此在运行时您正在运行JavaScript,因此将应用相同的规则。

我知道我迟到了,但是我发现这也是有效的。

 var constructorString: string = this.constructor.toString(); var className: string = constructorString.match(/\w+/g)[1]; 

另外…

 var className: string = this.constructor.toString().match(/\w+/g)[1]; 

上面的代码将整个构造函数的代码作为一个string,并应用正则expression式来获取所有的“单词”。 第一个单词应该是“function”,第二个单词应该是课程的名称。

希望这可以帮助。

我的解决scheme不是依靠类名。 object.constructor.name在理论上起作用。 但是如果你在Typeonic中使用类似于Ionic的types,那么一旦你进入制作阶段,它就会火上浇油,因为Ionic的生产模式会缩小Javascript代码。 所以这些类会被命名为“a”和“e”。

我最终做的是在构造函数分配类名的所有对象中都有一个typeName类。 所以:

 export class Person { id: number; name: string; typeName: string; constructor() { typeName = "Person"; } 

是的,这不是真正的问题。 但是使用constructor.name在可能被缩小的道路上只是乞求头痛。

您需要先将实例转换为any实例,因为Function的types定义没有name属性。

 class MyClass { getName() { return (<any>this).constructor.name; // OR return (this as any).constructor.name; } } // From outside the class: var className = (<any>new MyClass()).constructor.name; // OR var className = (new MyClass() as any).constructor.name; console.log(className); // Should output "MyClass" // From inside the class: var instance = new MyClass(); console.log(instance.getName()); // Should output "MyClass" 

更新:

使用TypeScript 2.4(可能更早),代码可以变得更清晰:

 class MyClass { getName() { return this.constructor.name; } } // From outside the class: var className = (new MyClass).constructor.name; console.log(className); // Should output "MyClass" // From inside the class: var instance = new MyClass(); console.log(instance.getName()); // Should output "MyClass" 

完整的TypeScript代码

 public getClassName() { var funcNameRegex = /function (.{1,})\(/; var results = (funcNameRegex).exec(this["constructor"].toString()); return (results && results.length > 1) ? results[1] : ""; } 

在angular2中,这可以帮助获取组件名称:

  getName() { let comp:any = this.constructor; return comp.name; } 

comp:any是必需的,因为typescript编译会发出错误,因为Function最初没有属性名称。

  • 不得不添加“。 原型 ”来使用: myClass.prototype.constructor.name
  • 否则使用下面的代码: myClass.constructor.name ,我有打字稿错误:

error TS2339: Property 'name' does not exist on type 'Function'

如果你已经知道什么types的期望(例如,当一个方法返回一个联合types ),那么你可以使用types警卫。

例如,对于原始types,您可以使用一个types的警卫 :

 if (typeof thing === "number") { // Do stuff } 

对于复杂的types,你可以使用一个instanceof guard :

 if (thing instanceof Array) { // Do stuff }