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

class MyClass{}

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

当前回答

我知道我迟到了,但我发现这个方法也很有效。

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

或者……

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

上面的代码以字符串的形式获取整个构造函数代码,并应用正则表达式来获取所有的“words”。第一个单词应该是“function”,第二个单词应该是类的名称。

希望这能有所帮助。

其他回答

看这个问题。

因为TypeScript被编译成JavaScript,所以在运行时你运行的是JavaScript,所以同样的规则也适用。

简单的回答:

class MyClass {}

const instance = new MyClass();

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

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

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

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

comp:any是必需的,因为TypeScript编译器会报错,因为Function最初没有属性名。

完整的TypeScript代码

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

使用装饰器的解决方案,在缩小/丑陋化中幸存

我们使用代码生成用元数据来装饰我们的实体类,如下所示:

@name('Customer')
export class Customer {
  public custId: string;
  public name: string;
}

然后使用以下助手进行消费:

export const nameKey = Symbol('name');

/**
 * To perserve class name though mangling.
 * @example
 * @name('Customer')
 * class Customer {}
 * @param className
 */
export function name(className: string): ClassDecorator {
  return (Reflect as any).metadata(nameKey, className);
}

/**
 * @example
 * const type = Customer;
 * getName(type); // 'Customer'
 * @param type
 */
export function getName(type: Function): string {
  return (Reflect as any).getMetadata(nameKey, type);
}

/**
 * @example
 * const instance = new Customer();
 * getInstanceName(instance); // 'Customer'
 * @param instance
 */
export function getInstanceName(instance: Object): string {
  return (Reflect as any).getMetadata(nameKey, instance.constructor);
}

额外信息:

您可能需要安装reflect-metadata reflect-metadata是由TypeScript成员为提议的ES7 Reflection API编写的填充 JS中关于装饰器的建议可以在这里找到