nodejs erfordern innerhalb der TypeScript-Datei


97

Wie lade ich ein reguläres NodeJS-Modul (von node_modules) aus einer TypeScriptKlasse heraus?

Wenn ich versuche zu kompilieren .ts Datei Folgendes enthält:

var sampleModule = require('modulename');

Compiler-Eingabeaufforderungen, die ich nicht verwenden kann, erfordern in diesem Bereich. (Diese Zeile steht am Anfang der Datei).


1
Können Sie uns Ihren Code zeigen (original und kompiliert)? Ich dachte, das requirekann überall verwendet werden, es hängt nicht vom Umfang ab.
freakish

Ja, muss aber deklariert werden und wird nicht in der Standardeinstellung lib.d.ts deklariert, wie Valentin vorgeschlagen hat.
Zdenek Sejcek

Antworten:


105

Typoskript beschwert sich immer, wenn kein Symbol gefunden werden kann. Der Compiler kommt zusammen mit einer Reihe von Standarddefinitionen für window, documentund so in einer Datei angegebenen genannt lib.d.ts. Wenn ich requirein dieser Datei nach grep suche, kann ich keine Definition einer Funktion finden require. Daher müssen wir dem Compiler selbst mitteilen, dass diese Funktion zur Laufzeit mithilfe der folgenden declareSyntax vorhanden ist:

declare function require(name:string);
var sampleModule = require('modulename');

Auf meinem System kompiliert dies einwandfrei.


23
Danke dir. Dies funktioniert für alle nicht deklarierten Funktionen. Eine bessere Lösung, die ich gefunden habe, besteht darin, node.d.ts aus Typoskript-Beispielen abzurufen und darauf zu verweisen. Dann hast du alles. Es gibt auch express.d.ts.
Zdenek Sejcek

2
Ich denke, Sie können auch tunimport sampleModule = module('modulename')
mpen

Ja, aber node.d.ts ist derzeit bei v0.8.8. Verwenden Sie besser den Ansatz von @Valentin und verwenden Sie dann beispielsweise die WebStorm-IDE, mit der Sie Definitionen für die von Ihnen ausgeführte Knotenversion herunterladen und die automatische Vervollständigung usw. durchführen können.
Radek

@Radek Wie machst du das? Ich verwende WebStorm 7.0.2 (aktuell). Übrigens finde ich das Skript node.d.ts nicht. Wo befindet es sich? Vielen Dank.
Vadorequest

1
@Vadorequest dies sollte helfen: jetbrains.com/webstorm/webhelp/…
Radek

61

Die richtige Syntax lautet:

import sampleModule = require('modulename');

oder

import * as sampleModule from 'modulename';

Kompilieren Sie dann Ihr TypeScript mit --module commonjs .

Wenn das Paket keine index.d.tsDatei enthält und package.jsonkeine "typings"Eigenschaft hat, tscwird es bellen, dass es nicht weiß, worauf es sich 'modulename'bezieht. Zu diesem Zweck müssen Sie eine .d.tsDatei dafür finden http://definitelytyped.org/ finden. finden oder selbst eine schreiben.

Wenn Sie Code für Node.js schreiben, möchten Sie auch die node.d.tsDatei von http://definitelytyped.org/ .


Ich folgte diesem Ansatz und verwendete "import * as $ s from 'scriptjs';" da ich TypeScript benutze. Der Befehl CKEDITOR.replace () scheint ausgeführt zu werden, und ich erhalte etwas, das wie ein gültiges DOM-Element aussieht, jedoch ändert sich nichts im Browser (immer noch ein Textbereich) und in den Rückrufen von editor.on ('contentDom', ...) (auch im Rückruf von $ s installiert) werden niemals aufgerufen. Irgendeine Idee, was los ist?
Vern Jensen

43

Die beste Lösung besteht darin, eine Kopie der Typdefinitionen des Knotens zu erhalten. Dies löst nicht nur alle Arten von Abhängigkeitsproblemen require(). Dies wurde zuvor mit Paketen wie durchgeführt typings, aber wie Mike Chamberlain erwähnte, sind Typisierungen veraltet. Der moderne Weg macht es so:

npm install --save-dev @types/node

Dadurch wird nicht nur der Compilerfehler behoben, sondern auch die Definitionen der Knoten-API zu Ihrer IDE hinzugefügt.


1
Das hat auch bei mir funktioniert! Was ich aber nicht verstehe ist, dass ich es global installiert hatte (dh :), npm install -g @types/nodeaber das hat nicht funktioniert?
Jeach

Was ist, wenn das Typmodul in npm nicht verfügbar ist?
Sudharshan Nair

@SudharshanNair Es gibt viele Typen, die vom DefinitelyTyped-Projekt definiert werden. Weitere Optionen sind das Verfassen von definitiv typisierten deklarierenden Typen in Ihrem eigenen Projekt oder die Verwendung ohne Typdefinitionen
rharriso

3

Verwenden Sie Typisierungen, um über TypeScript auf Knotenfunktionen zuzugreifen:

typings install env~node --global

Wenn Sie keine Eingaben haben 😲 Installieren Sie es:

npm install typings --global

20
Zu beachten ist, dass Schreibvorgänge zugunsten von einfachnpm install @types/node --save-dev
Mike Chamberlain
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.