2012-12-11 59 views
21

是否有一種方便的方法可以在模塊中訪問全局變量,而無需編譯器錯誤,即下面使用CANVAS_WIDTH?Typescript全局變量

export class Bullet { 


     x: number = 22; 
     y: number = 22; 

     constructor (speed: number) { 
      this.xVelocity = speed; 
     } 

     inBounds() { 
      return this.x >= 0 && this.x <= CANVAS_WIDTH && 
       this.y >= 0 && this.y <= CANVAS_HEIGHT; 
     }; 
} 
} 
+0

您將在哪裏設置CANVAS_WIDTH的值? –

+0

在用Bullet類導入模塊的遊戲類中GameObjects = module(「GameObjects」) – Nikos

+1

在Game類中有CANVAS_WIDTH,需要在Bullet類中訪問它。我對嗎? –

回答

24

您需要定義這些屬性爲靜態的,那麼你可以很容易地訪問它像這樣,

export class Game { 
    static canvas: JQuery; 
    static CANVAS_WIDTH: number; 
    static CANVAS_HEIGHT: number; 
    bullet: Bullet; 

    constructor(canvasElem: JQuery) { 
     Game.canvas = canvasElem; 
     Game.CANVAS_WIDTH = Game.canvas.width(); 
     Game.CANVAS_HEIGHT = Game.canvas.height(); 
    } 
} 

export class Bullet { 
    x: number = 22; 
    y: number = 22; 

    public inBounds() { 
     // accessing static properties 
     return this.x >= 0 && this.x <= Game.CANVAS_WIDTH && this.y >= 0 && this.y <= Game.CANVAS_HEIGHT; 
    } 
} 

這編譯爲:

define(["require", "exports"], function(require, exports) { 
    var Game = (function() { 
     function Game(canvasElem) { 
      Game.canvas = canvasElem; 
      Game.CANVAS_WIDTH = Game.canvas.width(); 
      Game.CANVAS_HEIGHT = Game.canvas.height(); 
     } 
     return Game; 
    })(); 
    exports.Game = Game; 

    var Bullet = (function() { 
     function Bullet() { 
      this.x = 22; 
      this.y = 22; 
     } 
     Bullet.prototype.inBounds = function() { 
      // accessing static properties 
      return this.x >= 0 && this.x <= Game.CANVAS_WIDTH && this.y >= 0 && this.y <= Game.CANVAS_HEIGHT; 
     }; 
     return Bullet; 
    })(); 
    exports.Bullet = Bullet; 
}); 
//# sourceMappingURL=dhdh.js.map 
+0

希望,這一個幫助。如果有幫助,接受爲答案。 –

+0

感謝隊友的幫助! – Nikos

+1

添加了編譯的JS文件 –

2

這是一個人爲的例子,但不是試圖推動全球範圍內,您可以使用該模塊範圍包圍將從幾個類中使用的變量。

module MyModule { 
    var x: number = 5; 

    export class FirstClass { 
     doSomething() { 
      x = 10; 
     } 
    } 

    export class SecondClass { 
     showSomething() { 
      alert(x.toString()); 
     } 
    } 
} 

var a = new MyModule.FirstClass(); 
a.doSomething(); 

var b = new MyModule.SecondClass(); 
b.showSomething(); 

所有關於使用同一個變量多的東西通常的規則適用於這裏 - 你不希望強制調用代碼事件的特定順序。


編譯爲:

var MyModule; 
(function (MyModule) { 
    var x = 5; 

    var FirstClass = (function() { 
     function FirstClass() { 
     } 
     FirstClass.prototype.doSomething = function() { 
      x = 10; 
     }; 
     return FirstClass; 
    })(); 
    MyModule.FirstClass = FirstClass; 

    var SecondClass = (function() { 
     function SecondClass() { 
     } 
     SecondClass.prototype.showSomething = function() { 
      alert(x.toString()); 
     }; 
     return SecondClass; 
    })(); 
    MyModule.SecondClass = SecondClass; 
})(MyModule || (MyModule = {})); 

var a = new MyModule.FirstClass(); 
a.doSomething(); 

var b = new MyModule.SecondClass(); 
b.showSomething(); 
+0

這是否仍然在最新版本的打字機?它沒有出現該示例編譯... – Kyle

+0

我已經更新了這個TypeScript 0.9.x – Fenton

+0

添加了編譯js作比較 –