2016-11-28 106 views
2

我正在使用typescript 2.0.6的离子2项目。Typescript静态方法继承

我有一个基类管理一些行为,我从这个基类继承几个类。 而且我希望能够获得实际班级的名称(而不是基础班级)。

这里是我的代码:

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 { 

} 

而且我有2种电话:要么MyClass1.oneStaticMethod()(new MyClass2).oneInstanceMethod()。我的问题是,此代码之前工作(现在我得到'E',因为它返回函数e())我在我的离子项目中做了一些升级。我认为我的打字稿版本已经升级(我不确定,但我认为它是1.8之前)。

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

谢谢!

+0

听起来像你的代码正在被缩小。你发布的代码[似乎按预期工作](https://jsfiddle.net/7bp44voz/)? – Jeroen

+0

您通常可以调整缩小类以保持类和函数的名称不变,但您可能需要重新考虑您的设计(即*为什么*您需要类名?还是用于调试?) – Jeroen

+0

不,我正在写一个ORM,我想在基类中抽象很多东西。我想用类名作为我的SQL表名。 –

回答

1

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

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

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

然后it runs as you expect

您遇到的问题很可能是由于缩小。您的班级名称在缩小时出现乱码。大多数minifier可以选择禁用类/函数的重命名,你没有提到你使用了哪一个,但是他们的文档肯定会提到这个问题。它会增加文件大小。

您在评论中澄清了一点,我仍然建议不要使用类名称,但更愿意明确说明这类事情。随着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正确捕获,指的是类的实例,而不是对正在执行的功能。

+0

谢谢!我试图找到缩小器,但我明白,最好是明确的,但我不能让打字稿使用我的继承静态方法或基类的属性。它总是调用基类方法或属性,所以我不能真正覆盖我的变量。在这一点上,使用类名称是唯一的工作解决方案:( –

+0

我已经添加了一种可能的方法来解决这个问题,请参阅脚注(注意,要让'this'在成员方法中正常工作,它可以是方便地将它们创建为lambda的,而不是像常规函数那样。) – Jeroen

+0

谢谢!让我试试,因为我总是用静态方法创建pb –