Ada*_*lls 233 typescript
是否可以使用typescript在运行时获取对象的类/类型名称?
class MyClass{}
var instance = new MyClass();
console.log(instance.????); // Should output "MyClass"
Run Code Online (Sandbox Code Playgroud)
Mik*_*zic 405
class MyClass {}
const instance = new MyClass();
console.log(instance.constructor.name); // MyClass
console.log(MyClass.name); // MyClass
Run Code Online (Sandbox Code Playgroud)
但是:请注意,使用缩小代码时名称可能会有所不同.
小智 26
我知道我迟到了,但我发现这也有效.
var constructorString: string = this.constructor.toString();
var className: string = constructorString.match(/\w+/g)[1];
Run Code Online (Sandbox Code Playgroud)
另外...
var className: string = this.constructor.toString().match(/\w+/g)[1];
Run Code Online (Sandbox Code Playgroud)
上面的代码将整个构造函数代码作为字符串获取并应用正则表达式来获取所有"单词".第一个单词应该是'function',第二个单词应该是该类的名称.
希望这可以帮助.
小智 16
我的解决方案不是依赖类名.object.constructor.name在理论上有效.但是如果你在像Ionic这样的东西上使用TypeScript,那么一旦你进入制作阶段,它就会起火,因为Ionic的制作模式会缩小Javascript代码.因此,类被命名为"a"和"e".
我最终做的是在构造函数为其分配类名的所有对象中都有一个typeName类.所以:
export class Person {
id: number;
name: string;
typeName: string;
constructor() {
typeName = "Person";
}
Run Code Online (Sandbox Code Playgroud)
是的,这不是问的,真的.但是使用constructor.name来解决可能会缩小规模的问题只是让人头疼.
Wes*_*y92 12
您需要先将实例强制转换为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"
Run Code Online (Sandbox Code Playgroud)
使用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"
Run Code Online (Sandbox Code Playgroud)
myClass.prototype.constructor.name。myClass.constructor.name,我遇到了 TypeScript 错误: error TS2339: Property 'name' does not exist on type 'Function'。
使用在缩小/丑化中幸存下来的装饰器的解决方案
我们使用代码生成来用元数据装饰我们的实体类,如下所示:
@name('Customer')
export class Customer {
public custId: string;
public name: string;
}
Run Code Online (Sandbox Code Playgroud)
然后使用以下助手消费:
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);
}
Run Code Online (Sandbox Code Playgroud)
额外信息:
reflect-metadatareflect-metadata 是由成员 ot TypeScript 为提议的 ES7 反射 API 编写的 pollyfill在Angular2中,这有助于获取组件名称:
getName() {
let comp:any = this.constructor;
return comp.name;
}
Run Code Online (Sandbox Code Playgroud)
comp:any是必需的,因为typescript compile会发出错误,因为Function最初没有属性名.
| 归档时间: |
|
| 查看次数: |
191588 次 |
| 最近记录: |