是否有可能在运行时使用TypeScript获得对象的类/类型名?
class MyClass{}
var instance = new MyClass();
console.log(instance.????); // Should output "MyClass"
是否有可能在运行时使用TypeScript获得对象的类/类型名?
class MyClass{}
var instance = new MyClass();
console.log(instance.????); // Should output "MyClass"
当前回答
如果您已经知道预期的类型(例如,当一个方法返回联合类型时),那么您可以使用类型保护。
例如,对于基本类型,你可以使用typeof守卫:
if (typeof thing === "number") {
// Do stuff
}
对于复杂类型,你可以使用一个instanceof guard:
if (thing instanceof Array) {
// Do stuff
}
其他回答
我知道我迟到了,但我发现这个方法也很有效。
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代码
public getClassName() {
var funcNameRegex = /function (.{1,})\(/;
var results = (funcNameRegex).exec(this["constructor"].toString());
return (results && results.length > 1) ? results[1] : "";
}
如果您已经知道预期的类型(例如,当一个方法返回联合类型时),那么您可以使用类型保护。
例如,对于基本类型,你可以使用typeof守卫:
if (typeof thing === "number") {
// Do stuff
}
对于复杂类型,你可以使用一个instanceof guard:
if (thing instanceof Array) {
// Do stuff
}
首先需要将实例强制转换为any,因为Function的类型定义没有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被编译成JavaScript,所以在运行时你运行的是JavaScript,所以同样的规则也适用。