打字稿静态方法继承
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();
您遇到的问题很可能是由于缩小。您的 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();
请注意,我也偷偷加入了这个:
getClassName = () => {
对
getClassName() {
以便 this
被正确捕获并引用 class 实例,而不是正在执行的函数。
我正在使用 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();
您遇到的问题很可能是由于缩小。您的 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();
请注意,我也偷偷加入了这个:
getClassName = () => {
对
getClassName() {
以便 this
被正确捕获并引用 class 实例,而不是正在执行的函数。