2016-04-05 52 views
0

我需要使用init()函數在第一次調用時初始化一個全局變量的「標記」。如何在打字稿中初始化一個全局變量

Q1。我如何使用init()初始化變量?在TypeScript中初始化全局變量的最佳做法是什麼? Q2302。由於這個變量是從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模塊就是這種情況,但我認爲其他類型也是如此。

如果您第二次導入模塊,模塊定義中的腳本將不會再次執行,並且第一次運行返回的導出將被重用。

這意味着你可以這樣做:

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名稱,但仍想要臨時變量的範圍,則可以使用立即調用的函數。

在你的情況下,單一的表達也將工作:

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