Typescript静态方法继承

时间:2016-11-28 10:37:50

标签: typescript typescript2.0

我正在使用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)。

我该如何解决这个问题?我尝试了很多东西(比如创建变量来存储值,但是在静态模式和实例模式下都不起作用)。

谢谢!

1 个答案:

答案 0 :(得分:1)

如果我逐字复制您的代码并添加:

var a = new MyClass1();
var b = new MyClass2();

document.body.innerHTML = a.getClassName() + " - " + b.getClassName();

然后it runs as you expect

您遇到的问题很可能是由于缩小。您的班级名称在缩小时会出现乱码。大多数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();

in action on jsfiddle

请注意,我也偷偷地说:

getClassName = () => {

VS

getClassName() {

这样就可以正确捕获this并引用类实例,而不是正在执行的函数。