是否有可能在运行时使用TypeScript获得对象的类/类型名?

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

但是,要注意,在使用简化代码时,名称可能会有所不同。

其他回答

如果您已经知道预期的类型(例如,当一个方法返回联合类型时),那么您可以使用类型保护。

例如,对于基本类型,你可以使用typeof守卫:

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

对于复杂类型,你可以使用一个instanceof guard:

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

完整的TypeScript代码

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

我的解决方案是不依赖类名。Object.constructor.name在理论上是可行的。但如果你在Ionic这样的平台上使用TypeScript,一旦你进入生产模式,它就会陷入困境,因为Ionic的生产模式减少了Javascript代码。所以类被命名为“a”和“e”。

我最后做的是在我的所有对象中都有一个typeName类,构造函数将类名赋给它。所以:

export class Person {
id: number;
name: string;
typeName: string;

constructor() {
typeName = "Person";
}

是的,这不是问的,真的。但是将constructor.name用于将来可能会被最小化的东西上是在自找麻烦。

简单的回答:

class MyClass {}

const instance = new MyClass();

console.log(instance.constructor.name); // MyClass
console.log(MyClass.name);              // MyClass

但是,要注意,在使用简化代码时,名称可能会有所不同。

必须添加".prototype."来使用:myClass.prototype.constructor.name。 否则用下面的代码: myclass。constructor。name,我有TypeScript错误:

TS2339:属性“name”在类型“Function”上不存在。