我正在使用typescript 2.0.6开发离子2项目。
我有一个管理一些行为的Base类,我从这个基类继承了几个类。 我希望能够得到实际类的名称(而不是基类)。
这是我的代码:
export class AbstractModel {
oneInstanceMethod() {
this.getClassName();
}
static oneStaticMethod() {
this.getClassName();
}
getClassName() {
return (<any>this).constructor.name;
}
static getClassName() {
return (<any>this).name;
}
}
export class MyClass1 extends AbstractModel {
}
export class MyClass2 extends AbstractModel {
}
我有两种电话:MyClass1.oneStaticMethod()
或(new MyClass2).oneInstanceMethod()
。
我的问题是这段代码之前正在运行(现在我得到'e'因为它返回了函数e())我在离子项目中进行了一些升级。我认为我的打字稿版本已升级(我不确定,但我认为它之前是1.8)。
我该如何解决这个问题?我尝试了很多东西(比如创建变量来存储值,但是在静态模式和实例模式下都不起作用)。
谢谢!
答案 0 :(得分:1)
如果我逐字复制您的代码并添加:
var a = new MyClass1();
var b = new MyClass2();
document.body.innerHTML = a.getClassName() + " - " + b.getClassName();
您遇到的问题很可能是由于缩小。您的班级名称在缩小时会出现乱码。大多数minifiers有一个选项来禁用类/函数的重命名,你没有提到你使用哪一个,但他们的文档肯定会说明这一点。它会增加文件大小。
你在评论中澄清了一点,我仍然建议不要使用类名,但更喜欢明确这类事情。使用Typescript,你获得工具支持自动重命名,但你有点再扔掉它。然后,这是你自己的设计决定。
脚注:根据您的设计偏好,这里的解决方案可能有用与否。它将关联表名的知识分派给实例变量:
class AbstractModel {
_tableName: string = null;
getClassName = () => {
if (!this._tableName) {
throw new Error("No table name was set for this DTO.");
}
return this._tableName;
}
}
class MyClass1 extends AbstractModel {
_tableName = "MyTable1";
}
class MyClass2 extends AbstractModel {
_tableName = "AnotherTable2";
}
var a = new MyClass1();
var b = new MyClass2();
document.body.innerHTML = a.getClassName() + " - " + b.getClassName();
请注意,我也偷偷地说:
getClassName = () => {
VS
getClassName() {
这样就可以正确捕获this
并引用类实例,而不是正在执行的函数。