nodejs wymagają wewnątrz pliku TypeScript

97

Jak załadować zwykły moduł NodeJS (z node_modules) z TypeScriptklasy?

Kiedy próbuję skompilować .tsplik zawierający:

var sampleModule = require('modulename');

Kompilator wyświetla monit, którego nie mogę użyć w tym zakresie. (ta linia znajduje się na początku pliku).

Zdenek Sejcek
źródło
1
Czy możesz pokazać nam swój kod (oryginalny i skompilowany)? Pomyślałem, że requiremożna go używać wszędzie, nie zależy to od zakresu.
dziwaczny
Tak, ale musi zostać zadeklarowany i nie jest zadeklarowany w domyślnym lib.d.ts, jak sugerował Valentin.
Zdenek Sejcek

Odpowiedzi:

105

Maszynopis zawsze narzeka, gdy nie może znaleźć symbolu. Kompilator przychodzi wraz z zestawem standardowych definicji window, documenti takie określonych w pliku o nazwie lib.d.ts. Jeśli wykonam grep requirew tym pliku, nie mogę znaleźć definicji funkcji require. Dlatego musimy sami powiedzieć kompilatorowi, że ta funkcja będzie istnieć w czasie wykonywania, używając declareskładni:

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

W moim systemie kompiluje się dobrze.

Valentin
źródło
23
Dziękuję Ci. Będzie to działać dla wszystkich niezadeklarowanych funkcji. Lepszym rozwiązaniem, które znalazłem, jest pobranie node.d.ts z próbek maszynopisu i odniesienie do niego. Niż masz wszystko. Istnieje również express.d.ts.
Zdenek Sejcek
2
Myślę, że możesz też to zrobićimport sampleModule = module('modulename')
mpen
Tak, ale node.d.ts jest obecnie pod adresem v0.8.8. Lepiej jest użyć podejścia @Valentin, a następnie użyć, powiedzmy, środowiska WebStorm IDE, które może pobrać definicje dla wersji używanego węzła i zapewnić autouzupełnianie itp.
Radek
@Radek Jak to robisz? Używam WebStorm 7.0.2 (najnowszy) Btw nie mogę znaleźć skryptu node.d.ts, gdzie się on znajduje? Dzięki.
Vadorequest
1
@Vadorequest to powinno pomóc: jetbrains.com/webstorm/webhelp/…
Radek
62

Prawidłowa składnia to:

import sampleModule = require('modulename');

lub

import * as sampleModule from 'modulename';

Następnie skompiluj swój TypeScript z --module commonjs.

Jeśli do pakietu nie dołączono index.d.tspliku i package.jsonnie ma on "typings"właściwości, tscszczeka, że ​​nie wie, do czego się 'modulename'odnosi. W tym celu musisz znaleźć odpowiedni .d.tsplik na http://definitelytyped.org/ lub napisać go samodzielnie.

Jeśli piszesz kod dla Node.js, będziesz potrzebować również node.d.tspliku z http://definitelytyped.org/ .

Jesse
źródło
Postępowałem zgodnie z tym podejściem, używając "import * as $ s from 'scriptjs';" ponieważ używam TypeScript. Wydaje się, że polecenie CKEDITOR.replace () wydaje się być wykonywane i otrzymuję z niego coś, co wygląda na prawidłowy element DOM, jednak nic się nie zmienia w przeglądarce (nadal jest to obszar tekstowy) i moim edytorze.on ('contentDom', ...) wywołania zwrotne (również zainstalowany wewnątrz wywołania zwrotnego $ s) nigdy nie zostaniesz wywołany. Masz jakiś pomysł, co słychać?
Vern Jensen
43

Najlepszym rozwiązaniem jest pobranie kopii definicji typu węzła. To rozwiąże wszystkie rodzaje problemów związanych z zależnościami, nie tylko require(). Wcześniej było to robione przy użyciu takich pakietów, jak typings, ale jak wspomniał Mike Chamberlain, typy są przestarzałe. Współczesny sposób robi to w następujący sposób:

npm install --save-dev @types/node

Nie tylko naprawi błąd kompilatora, ale również doda definicje Node API do twojego IDE.

rharriso
źródło
1
Dla mnie to też zadziałało! Ale nie rozumiem, że zainstalowałem go globalnie (tj .:), npm install -g @types/nodeale to nie zadziałało?
Jeach
Co jeśli moduł typów nie jest dostępny w npm?
Sudharshan Nair
@SudharshanNair istnieje wiele typów zdefiniowanych w projekcie DefinitelyTyped. Inne opcje obejmują przeciwdziałanie określaniu typów deklarowanych w ramach własnego projektu lub używanie bez
definicji
3

Użyj typów, aby uzyskać dostęp do funkcji węzłów z języka TypeScript:

typings install env~node --global

Jeśli nie masz znaków 😲 zainstaluj go:

npm install typings --global
Oded Breiner
źródło
20
Należy zauważyć, że pisanie jest przestarzałe na rzecz prostegonpm install @types/node --save-dev
Mike Chamberlain