In JavaScript kann ich das einfach so machen:
something = 'testing';
Und dann in einer anderen Datei:
if (something === 'testing')
und es wird something
definiert worden sein (solange sie in der richtigen Reihenfolge aufgerufen wurden).
Ich kann anscheinend nicht herausfinden, wie das in TypeScript geht.
Das habe ich versucht.
In einer .d.ts-Datei:
interface Window { something: string; }
Dann in meiner main.ts-Datei:
window.something = 'testing';
dann in einer anderen Datei:
if (window.something === 'testing')
Und das funktioniert. Aber ich möchte in der Lage sein, den window.
Teil davon zu verlieren und einfach something
global zu sein. Gibt es eine Möglichkeit, dies in TypeScript zu tun?
(Falls jemand interessiert ist, versuche ich wirklich, meine Protokollierung für meine Anwendung einzurichten. Ich möchte log.Debug
aus jeder Datei aufrufen können, ohne Objekte importieren und erstellen zu müssen.)
quelle
.d.ts
Definitionsdatei erfolgen.export declare const SERVER = "10.1.1.26";
eval
wird dringend abgeraten, daher empfehle ich die Verwendung dieser Lösung stackoverflow.com/a/56984504/5506278In einer
.d.ts
DefinitionsdateiWenn Sie im Browser arbeiten, fügen Sie dem Fensterkontext des Browsers Mitglieder hinzu:
Gleiche Idee für NodeJS:
Jetzt deklarieren Sie die Stammvariable (die tatsächlich im Fenster oder global lebt).
Dann
.ts
implementieren Sie es in einer regulären Datei, die jedoch als Nebeneffekt importiert wurde:Und schließlich verwenden Sie es an anderer Stelle in der Codebasis, entweder mit:
quelle
.ts
Dateien, aber wenn ich eswindow.myGlobalFunction
in meinen.tsx
Dateien verwende, funktioniert es nicht. Was muss ich noch ändern?!globalThis ist die Zukunft.
Erstens gibt es bei TypeScript-Dateien zwei Arten von
scopes
globaler Geltungsbereich
Wenn Ihre Datei keine
import
oder keineexport
Zeile enthält , wird diese Datei im globalen Bereich ausgeführt sodass alle darin enthaltenen Deklarationen außerhalb dieser Datei sichtbar sind.Wir würden also globale Variablen wie folgt erstellen:
Modulumfang
Wenn Ihre Datei eine
import
oder eineexport
Zeile enthält , wird diese Datei in ihrem eigenen Bereich ausgeführt, den wir durch Zusammenführen von Deklarationen global erweitern müssen .quelle
var
ist notwendig. Aber Sie können einfach Variable ohne Initialisierung deklarieren// @ts-ignore
über derglobalThis
Linie für den Linter hinzufügen .So habe ich es behoben:
Schritte:
Hinweis:
Typoskript-Version: "3.0.1".
In meinem Fall bestand die Anforderung darin, die globale Variable festzulegen, bevor die Anwendung gestartet wird, und die Variable sollte auf alle abhängigen Objekte zugreifen, damit wir die erforderlichen Konfigurationseigenschaften erhalten können.
Hoffe das hilft!
Danke dir
quelle
Ich habe einen Weg gefunden, der funktioniert, wenn ich JavaScript in Kombination mit TypeScript verwende.
logging.d.ts:
Protokolldeklaration. js :
initalize-app.ts
Dies versetzt es in den globalen Bereich und TypeScript weiß davon. So kann ich es in allen meinen Dateien verwenden.
HINWEIS: Ich denke, dies funktioniert nur, weil ich die
allowJs
TypeScript-Option auf true gesetzt habe.Wenn jemand eine reine TypeScript-Lösung veröffentlicht, werde ich das akzeptieren.
quelle
declare var log: any;
Dann benötigen Sie weder die Datei d.ts noch die Datei js. Sie können jeden auch durch einen tatsächlichen Typ oder eine Schnittstellendefinition ersetzen.Ich benutze nur das
quelle
Ich habe ein paar Stunden damit verbracht, herauszufinden, wie ich es richtig machen kann. In meinem Fall versuche ich, eine globale "Protokoll" -Variable zu definieren, also waren die Schritte:
1) Konfigurieren Sie Ihre
tsconfig.json
, um Ihre definierten Typensrc/types
einzuschließen ( Ordner, Knotenmodule - liegt bei Ihnen):2) Erstellen Sie eine Datei
src/types/global.d.ts
mit folgendem Inhalt ( keine Importe! - das ist wichtig). Sie können sie jederzeitany
an Ihre Bedürfnisse anpassen und diewindow
Benutzeroberfläche verwenden, anstattNodeJS
mit dem Browser zu arbeiten:3) Jetzt können Sie endlich verwenden / implementieren,
log
wo es benötigt wird:quelle
paths
intsconfig.json
? Die Dokumente haben keine Erwähnung.Global
in den Definitionen groß geschrieben, aber nicht in der tatsächlichen Verwendung?Global
mit Kapital - so wird die "globale" Schnittstellendeklaration im Namespace von nodejs benannt.Als Ergänzung zu Dima Vs Antwort habe ich dies getan, um diese Arbeit für mich zu machen.
// First declare the window global outside the class
declare let window: any;
// Inside the required class method
let globVarName = window.globVarName;
quelle
Ich musste lodash global machen, um eine vorhandene .js-Datei zu verwenden, die ich nicht ändern konnte, sondern nur benötigte.
Ich fand, dass dies funktionierte:
quelle
Dies funktioniert für mich, wie in diesem Thread beschrieben :
quelle