2012-12-11 23 views
21

Esiste un modo conveniente per accedere alle variabili globali all'interno dei moduli, senza errori del compilatore, ad esempio CANVAS_WIDTH utilizzato di seguito?Variabili globali dattiloscritto

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

dove si imposterà il valore per CANVAS_WIDTH? –

+0

nella classe di gioco che importa il modulo con la classe Bullet GameObjects = module ("GameObjects") – Nikos

+1

Hai CANVAS_WIDTH nella classe Game e devi accedervi nella classe Bullet. Ho ragione? –

risposta

24

È necessario definire tali proprietà come statica, quindi è possibile accedervi facilmente in questo modo,

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; 
    } 
} 

Questo compila a:

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

Spero che questo aiuti. Accetta come risposta se aiuta. –

+0

grazie amico per l'aiuto! – Nikos

+1

ha aggiunto il file JS compilato –

2

Questo è un esempio forzato, ma anziché cercare di spingere a portata globale, è possibile utilizzare l'ambito modulo per racchiudere una variabile che verrà utilizzato da diverse classi.

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(); 

Tutte le solite regole su più cose usando la stessa variabile applicano qui - non si vuole far rispettare un ordine particolare di eventi sul codice chiamante.


compila a:

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

Funziona ancora nell'ultima versione di dattiloscritto? Non appare l'esempio compila ... – Kyle

+0

Ho aggiornato questo per TypeScript 0.9.x – Fenton

+0

aggiunto js compilato per il confronto –