2017-04-19 3 views
0

Wenn ich eine Klasse:Wie kann ich die Definition der realen Klasse erstellen?

in der Datei "BigClass.ts":

class BigClass{ 
    /// a lot of properties and methods here, I mean, a lot 
} 
window['big'] = new BigClass(); 

Und ich möchte global in "Big.d.ts" erklären:

declare let big:BigClass; 

TS lässt mich das nicht machen, weil ich deklarierte Variablen nur über Schnittstellen auch von .d-Dateien definieren kann.

Aber diese Klasse ist sehr groß, ich will nicht eine Schnittstelle für sie schaffen, wo ich werde jede einzelne Stütze und Verfahren wiederholt ... Gibt es eine Möglichkeit, um es?

Oder vielleicht gibt es eine andere Art und Weise globale Variable zu deklarieren, basierend auf bestehenden Klasse, die ich nicht bewusst bin?

+0

FYI: 'tsc -d' der Lage ist, um '.d.ts' aus' .ts' zu erzeugen. – Jokester

+0

Richtig, aber ich die Klasse bin ständig ändern, ich will nicht die Schnittstelle die ganze Zeit ändern ... – shal

Antwort

1

Die Art und Weise, dies zu tun, ist einfach declare let big:BigClass; in BigClass.ts setzen, und nicht in einer d.ts Datei. Es ist vollkommen legal.

Diese BigClass.ts wird unter der Annahme, ist kein Modul, dh es ist kein Import \ Export-Anweisungen hat. Wenn es kein Modul ist, würden auch andere Dateien die declare-Anweisung "sehen".

Dies ist jedoch eine schlechte Praxis, da Sie auf die Tatsache, dass window nur zufällig das globale Objekt im Browser ist.

der bessere Weg:

//file: BigClass.ts 

class BigClass{ 
} 

interface Window { 
    big: BigClass; 
} 
window.big = new BigClass(); 

Und da Module mit wirklich, wirklich mehr schön sind, um hier zu arbeiten, wie Sie dies tun, mit Modulen:

//file: BigClass.ts 

export class BigClass{ 
} 
declare global { 
    interface Window { 
    big: BigClass; 
    } 
} 
window.big = new BigClass(); 
+0

Leider funktioniert es nicht für mich. Ja, diese Klasse befindet sich in einem Modul, das Import/Export verwendet. Ich habe alle drei Methoden ausprobiert, um sie zu deklarieren. In allen Fällen klagt eine andere .ts-Datei: "Kann den Namen nicht finden" ... – shal

+1

@shal window.big' aus einer anderen Datei? (über die letzte Methode, die ich zeigte). Oder alternativ, wenn Sie wirklich eine globale var wollen, versuchen Sie 'erklären global {const groß: BigClass}' –

+0

Perfect, jetzt hat es funktioniert !!! Zu guter Letzt! Ich weiß, ich sollte hier keine bedeutungslosen "Danke" -Kommentare posten, aber in diesem Fall ist es unwiderstehlich :) – shal

0

Und ich möchte global erklären, in "Big.d.ts":

Warum möchten Sie das tun? Wenn Sie eine Instanz dieser Klasse deklarieren, wissen ts bereits alles über diese Klasse. Und vermeiden Sie auch globale Variablen. const big = new BigClass();

+0

Ich weiß, dass ich globale Klassen vermeiden sollte, aber ich bin ein großes JavaScript Projekt TS übersetzen, fast vollständig übersetzt, aber es verwendet globale Variablen (nicht zu viele, aber ausgiebig). Alles klar, ich muss gehen und eine Schnittstelle erzeugen, keine andere Wahl jetzt ... – shal

Verwandte Themen