186 votes

Créer une variable globale à la Machine

En JavaScript, je peux faire ça:

 something = 'testing';

Et puis dans un autre fichier:

 if (something === 'testing')

et il faudra something être défini (tant qu'ils ont été appelés dans le bon ordre).

Je n'arrive pas à comprendre comment le faire à la Machine.

C'est ce que j'ai essayé.

Dans une .d.ts fichier:

interface Window { something: string; }

Puis, dans ma main.ts fichier:

 window.something = 'testing';

puis dans un autre fichier:

 if (window.something  === 'testing')

Et cela fonctionne. Mais je veux être en mesure de perdre l' window. partie, et seulement ma something être global. Est-il un moyen de le faire à la Machine?

(Au cas où quelqu'un est intéressé, je suis vraiment essayer de configurer mon enregistrement pour mon application. Je veux être en mesure d'appeler log.Debug à partir de n'importe quel fichier sans avoir à importer et créer des objets.)

84voto

Benoit B. Points 1009

À l'intérieur d'un .d.ts le fichier de définition de

type MyGlobalFunctionType = (name: string) => void

Si vous travaillez dans le navigateur, vous ajoutez des membres à la fenêtre du navigateur contexte:

interface Window {
  myGlobalFunction: MyGlobalFunctionType
}

Même idée pour NodeJS:

declare module NodeJS {
  interface Global {
    myGlobalFunction: MyGlobalFunctionType
  }
}

Maintenant, vous déclarez la racine de la variable (qui vivent sur la fenêtre ou global)

declare const myGlobalFunction: MyGlobalFunctionType;

Puis, en une régulières .ts le fichier, mais importées comme effet secondaire, vous avez réellement la mettre en œuvre:

global/* or window */.myGlobalFunction = function (name: string) {
  console.log("Hey !", name);
};

Et enfin l'utiliser ailleurs dans le code, soit avec:

global/* or window */.myGlobalFunction("Kevin");

myGlobalFunction("Kevin");

18voto

Vaccano Points 18515

J'ai trouvé un moyen qui fonctionne si j'utilise JavaScript combiné avec des caractères d'imprimerie.

la journalisation.d.ts:

declare var log: log4javascript.Logger;

journal-déclaration.js:

log = null;

initalize-app.ts

import './log-declaration.js';

// Call stuff to actually setup log.  
// Similar to this:
log = functionToSetupLog();

Cela le place dans la portée globale et Tapuscrit sait à ce sujet. Donc je peux l'utiliser dans tous mes fichiers.

REMARQUE: je pense que cela ne fonctionne que parce que j'ai l' allowJs Tapuscrit option est définie à true.

Si quelqu'un poste une pure Tapuscrit solution, je vais l'accepter.

6voto

Dima V Points 64

im en utilisant uniquement cette

import {globalVar} from "./globals";
declare let window:any;
window.globalVar = globalVar;

3voto

tforgione Points 765

Ok, donc c'est sans doute encore plus laid que ce que vous avez fait, mais de toute façon...

mais je fais la même chose donc...

Ce que vous pouvez faire pour le faire dans le plus pur Tapuscrit, est d'utiliser l' eval de la fonction comme ceci :

declare var something: string;
eval("something = 'testing';")

Et plus tard, vous serez capable de le faire

if (something === 'testing')

Ce n'est rien de plus qu'un hack pour forcer l'exécution de l'instruction, sans Tapuscrit refusant de le compiler, et nous declare var pour le Tapuscrit pour compiler le reste du code.

0voto

Jonathan Cardoz Points 145

Comme un addon pour Dima V la réponse c'est ce que j'ai fait pour faire ce travail pour moi.

// First declare the window global outside the class

declare let window: any;

// Inside the required class method

let globVarName = window.globVarName;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X