2016-11-28 105 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 –