打字稿静态方法继承

Typescript static methods inheritance

我正在使用 typescript 2.0.6 开发一个 ionic 2 项目。

我有一个 Base class 来管理一些行为,我从这个 base class 继承了几个 classes。 我希望能够获得实际 class 的名称(不是基本名称)。

这是我的代码:

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' 因为它 returns 函数 e())我在我的离子项目中做了一些升级。我认为我的打字稿版本已经升级(我不确定但我认为它是之前的 1.8)。

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

谢谢!

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

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

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

然后it runs as you expect.

您遇到的问题很可能是由于缩小。您的 class 名称在缩小时出现乱码。大多数 minifiers 都有一个选项来禁用 classes/functions 的重命名,您没有提到您使用的是哪个,但他们的文档肯定会说明这一点。但它会增加文件大小。

你在评论中澄清了一点,我仍然建议不要使用 class 名称,但更喜欢明确说明这种事情。使用 Typescript,您 获得 对自动重命名的工具支持,但您又有点把它扔掉了。再一次,这是你自己的设计决定。


脚注:根据您的设计偏好,这里有一个可能有用或无用的解决方案。它将关联的 table 名称的知识分派给一个实例变量:

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 = () => {

getClassName() {

以便 this 被正确捕获并引用 class 实例,而不是正在执行的函数。