2014-06-19 76 views
2

是否可以調用類型參數的靜態方法?例如,我有以下代碼:如何在TypeScript中調用類型參數的靜態方法

class BaseA1 { 
    public static getString(): string { 
    return "A1"; 
    } 
} 

class A<A1 extends BaseA1> { 
    constructor() { 
    var name = A1.getString(); // <== error [the property getString does not exist ...] 
    } 
} 

如何正確調用靜態方法?有沒有可能,如果不是什麼可能是最好的替代方法?謝謝,親切。

+0

這是一個很好的平衡,但是因爲這純粹涉及到TypeScript的類的東西,根本不涉及JavaScript,所以我刪除了'javascript'標記。 (許多TypeScript問題也適用於'javascript'標籤,但是當問題純粹是關於TypeScript語言功能的時候,這不適用。) –

+0

好問題,順便說一句,並且問得很好。 –

回答

2

靜態方法屬於類類型,而不屬於實例。特別是,如果A1定義了它自己的getString,它不會是一個重寫的方法,而是一個陰影方法。

所以你想要做的唯一場景是有意義的,當你想依賴一個類型從它的基類型中映射一個方法。然而,這將是非常臭的代碼(換句話說:不要這樣做)。

要麼調用BaseA1.getString(),要麼如果您需要在子類中重寫它的方法,請將它作爲適當的實例方法。看到你的例子返回子類的名字,我傾向於認爲你試圖達到某種可疑的目的,並且建議你就你想解決的根本問題提出另一個問題,而不是問如何使問題成爲問題目前的設計工作。

您可以在這個here找到解釋;這是關於Java而不是Typescript,但這個想法是一樣的。

+0

tldr;靜態屬於BaseA1,一個已知的類型,所以爲什麼要從A1調用? – x0n

+0

@ x0n:如果它被所使用的具體類型遮蔽,因爲'constructor'是特定於實例的,並且具體類型是已知的。這個問題非常有意義,並且有一個處理它的論據(同樣,只在特定於實例的代碼中)。 TypeScript顯然沒有,Java也沒有(Java會編譯它,但是調用BaseA1的版本),但是在很高的層次上這個問題是非常合理的(在Typescript中比在Java中更合理,因爲TypeScript更具動態性,但可能合理都)。 –

+0

這是coindings(談論子類的名字)。返回字符串可能是任何內容。也許,我正在編寫一個MVC模式的模型層,每個類代表一個實體。所有實體的根父類都有一個靜態方法,它返回數據庫中表的名稱。這個方法應該在descedants中重寫。情況就是如此。 –

相關問題