2016-04-05 15 views
0

init()関数を使って最初の呼び出しで初期化されるグローバル変数を "tokens"にする必要があります。グローバル変数をtypescriptで一度だけ初期化する方法

Q1。 init()を使って変数を初期化するにはどうすればよいですか? TypeScriptのグローバル変数を初期化するベストプラクティスは何ですか?

Q2。この変数はjsonファイルから初期化されるため、アプリケーションの存続期間中に初めて一度だけ初期化することはできますか?したがって、この変数を別のファイルにインポートすると、jsonファイルを再度読み取る必要はありません。

export var tokens: Token[] = []; 

function init() { 
    if (tokens) return; // already initialized 
    let tokensJson = fs.readFileSync("./lib/data/tokens.json", "utf8"); 
    let tokensData = JSON.parse(tokensJson); 
    for (var i = 0; i < tokensData.length; i++) { 
     tokens.push(new Token(tokensData[i].name, tokensData[i].type)); 
    } 
} 

クライアントコード:

file1.ts

import { tokens } from "./tokens"; 
for (var i = 0; i < tokens.length; i++) 
    ... 

file2.ts

import { tokens } from "./tokens"; 
for (var i = 0; i < tokens.length; i++) 
    ... 

私は本当に感謝あなたは私のアイデアやグローバル作成の最高のパターンを与えることができれば一度初期化されるが、TypeScriptの異なるファイルから使用できる静的モジュール変数。

答えて

1

モジュールのトップレベルコードは、モジュールが初めてロードされたときに一度だけ実行されます。少なくともCommonJSモジュールの場合はそうですが、私は他のタイプも考えています。

モジュールを2回目にインポートすると、モジュール定義内のスクリプトは再度実行されず、最初の実行から返されたエクスポートが再利用されます。あなたができることを意味

export var tokens: Token[] = []; 

function init() { 
    let tokensJson = fs.readFileSync("./lib/data/tokens.json", "utf8"); 
    let tokensData = JSON.parse(tokensJson); 
    for (var i = 0; i < tokensData.length; i++) { 
     tokens.push(new Token(tokensData[i].name, tokensData[i].type)); 
    } 
} 

init() 

それともあなたも、init関数の宣言を省略し、モジュールに直接コンテンツを置くことができます。また、init名が気に入らずに一時変数のスコープを設定したい場合は、直ちに呼び出される関数を使用してください。

あなたのケースでは、単一の式でも動作します:

export var tokens = 
    JSON.parse(fs.readFileSync("./lib/data/tokens.json", "utf8")) 
    .map(td => new Token(td.name, td.type));