gpt4 book ai didi

typescript 静态方法继承

转载 作者:搜寻专家 更新时间:2023-10-30 21:52:32 25 4
gpt4 key购买 nike

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

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

这是我的代码:

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())我在我的 ionic 项目中做了一些升级。我认为我的 typescript 版本已经升级(我不确定但我认为它是之前的 1.8)。

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

谢谢!

最佳答案

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

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

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

然后 it runs as you expect .

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

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


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

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 被正确捕获并引用类实例,而不是正在执行的函数。

关于 typescript 静态方法继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40842206/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com