nodejs требует внутри файла TypeScript

77

Как загрузить обычный модуль NodeJS (из node_modules) из класса TypeScript?

Когда я пытаюсь скомпилировать файл .ts который содержит:

var sampleModule = require('modulename');

Компилятор подсказывает, что я не могу использовать требовать в этой области. (эта строка находится в начале файла).

  • 1
    Можете ли вы показать нам свой код (оригинальный и скомпилированный)? Я думал, что require можно использовать где угодно, это не зависит от области применения.
  • 0
    Да, но должен быть объявлен и не объявлен в lib.d.ts по умолчанию, как предложил Валентин.
Теги:

4 ответа

79
Лучший ответ

Typescript всегда будет жаловаться, когда он не сможет найти символ. Компилятор поставляется вместе с набором определений по умолчанию для window, document и таких, которые указаны в файле с именем lib.d.ts. Если я сделаю grep для require в этом файле, я не найду никакого определения функции require. Следовательно, мы должны сами сообщить компилятору, что эта функция будет существовать во время выполнения с использованием синтаксиса declare:

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

В моей системе это компилируется просто отлично.

  • 22
    Спасибо. Это будет работать для всех функций, которые не объявлены. Лучшее решение, которое я нашел, это взять node.d.ts из примеров машинописного текста и сослаться на него. Чем у тебя есть все. Также есть express.d.ts.
  • 0
    Спасибо, я не знал о node.d.ts. Это даже лучше.
Показать ещё 7 комментариев
37

Правильный синтаксис:

import sampleModule = require('modulename');

или же

import * as sampleModule from 'modulename';

Затем скомпилируйте ваш TypeScript с помощью --module commonjs.

Если пакет не поставляется с файлом index.d.ts и его package.json не имеет "typings", tsc будет лаять, что не знает, на что 'modulename'. Для этого вам нужно найти файл .d.ts для него на http://definitetyped.org/ или написать его самостоятельно.

Если вы пишете код для Node.js, вам также понадобится файл node.d.ts с http://definitetyped.org/.

  • 0
    Я следовал этому подходу, используя "import * as $ s из 'scriptjs';" так как я использую TypeScript. Команда CKEDITOR.replace (), кажется, выполняется, и я получаю из нее то, что выглядит как действительный элемент DOM, однако ничего не меняется в браузере (все еще текстовой области) и моих обратных вызовах editor.on ('contentDom', ...) (также установлен внутри обратного вызова $ s) никогда не вызывается. Есть идеи, что случилось?
30

Лучшее решение - получить копию определений типов узлов. Это решит все виды проблем с зависимостями, а не только require(). Ранее это делалось с использованием таких пакетов, как typings, но, как отметил Майк Чемберлен, набор текста не рекомендуется. Современный способ делает это так:

npm install --save-dev @types/node

Он не только исправит ошибку компилятора, но и добавит определения Node API в вашу IDE.

  • 0
    Быстро, легко, больше ничего не надо было делать. Спасибо!
  • 2
    Это должен быть принятый ответ! После установки объявлений типа узла все работает без нареканий. Спасибо.
Показать ещё 1 комментарий
4

Используйте типизацию для доступа к функциям node из TypeScript:

typings install env~node --global

Если у вас нет пиктограмм установите его:

npm install typings --global
  • 14
    Следует отметить, что типизация не рекомендуется в пользу просто npm install @types/node --save-dev

Ещё вопросы

Сообщество Overcoder
Наверх
Меню