2017-03-15 55 views
0

我對Javascript和Typescript都是新手。我用Javascript編寫了一個簡單的Phaser遊戲,現在想用Typescript ES2015(ES6)重新編寫它。
我已經擴展Phaser.Game類,以便通過它的構造函數傳遞一個變量。這用於創建websocket。這個套接字可以作爲Game或State類型的一個屬性存在(我在示例中顯示了這一點)。
我已經擴展Phaser.State類以包含需要通過websocket的.onmessage成員函數由websocket數據設置的屬性。如何使用Phaser正確使用Typescript擴展類

爲了完整性,我已經展示了createWebsocket作爲函數,實際上它是其中一個類的成員函數。

function createWebsocket(wsPath, callback){ 
    var ws = new WebSocket(wxPath); 
    ws.onmessage = callback; 
    return ws; 
} 

export class Game extends Phaser.Game { 
    csocket: WebSocket; 
    constructor(wsPath, container) { 
    this.state.add('Boot', Boot, false); 
    this.csocket = createWebsocket(wsPath, this.handleMsg); 
} 

export class Boot extends Phaser.State { 
    csocket: WebSocket; 
    constructor(){super();} 
    my_value: number; 
    setMyValue(value) {this.my_value = value}; 
    this.csocket = createWebsocket(wsPath, this.handleMsg); 
} 

我該如何將數據從擴展的Game類實例傳遞到Boot實例或訪問Boot實例的createWebsocket成員函數?

如果我在遊戲中使用以下內容;

state = this.state.getCurrentState(); 
state.setValue() 

我得到了(反)編譯器錯誤,如getCurrentState()返回基類的實例並不即使擴展類的類型傳遞給state.add功能

我的擴展類看到沒有辦法將wsPath傳遞給Boot類的構造函數,因爲類型被傳遞給.add函數。

回答

0

簡單的答案總是最好的。所以,回答我自己的問題......

雖然這些例子沒有清楚地表明這一點,但this.state.add調用不僅僅允許一個類,它還允許一個類實例。只需使用新的。

export class Game extends Phaser.Game { 
    csocket: WebSocket; 
    constructor(wsPath, container) { 
     var bootState = new Boot(wsPath); 
     this.state.add('Boot', bootState, false); 
...