2016-04-05 6 views
0

Ich muss "Token" eine globale Variable, die beim ersten Aufruf mit der Funktion init() initialisiert werden.So initialisieren Sie eine globale Variable nur einmal in Typoskript

Q1. Wie kann ich die Variable mit init() initialisieren? Was ist die beste Vorgehensweise zum Initialisieren einer globalen Variablen in TypeScript?

Q2. Da diese Variable aus einer JSON-Datei initialisiert wird, wie kann ich sie NUR während der Laufzeit meiner Anwendung initialisieren? Wenn ich diese Variable in verschiedene Dateien importiere, möchte ich die JSON-Datei nicht erneut lesen.

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

Client-Code:

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++) 
    ... 

ich wirklich schätzen, wenn Sie eine Idee geben könnte mir oder beste Muster global zu schaffen oder statische Modulvariablen, die einmal initialisiert werden, aber aus verschiedenen Dateien in TypeScript verwendet werden können.

Antwort

1

Der oberste Code eines Moduls wird genau einmal ausgeführt - wenn das Modul zum ersten Mal geladen wird. Das ist zumindest bei CommonJS-Modulen der Fall, aber ich denke auch für die anderen Typen.

Wenn Sie das Modul zum zweiten Mal importieren, wird das Skript in der Moduldefinition nicht erneut ausgeführt und die zurückgegebenen Exporte aus dem ersten Lauf werden wiederverwendet.

Das heißt, Sie tun könnten:

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

Oder Sie könnten sogar die init-Funktion Erklärung weglassen und den Inhalt direkt in das Modul stecken. Oder verwenden Sie eine direkt aufgerufene Funktion, wenn Sie den Initialisierungsnamen nicht mögen, aber dennoch die temporären Variablen definieren möchten.

In Ihrem Fall ein einzelner Ausdruck würde auch funktionieren:

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