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


97

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

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

var sampleModule = require('modulename');

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


1
Вы можете показать нам свой код (оригинальный и скомпилированный)? Я думал, что requireможно использовать где угодно, это не зависит от объема.
— причудливый

Да, но должно быть объявлено и не объявлено в lib.d.ts по умолчанию, как предложил Валентин.
— Zdenek Sejcek 05

Ответы:


105

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

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

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


23
Спасибо. Это будет работать для всех не объявленных функций. Лучшее решение, которое я нашел, - это получить node.d.ts из образцов машинописного текста и ссылаться на него. Тогда у вас есть все. Также есть экспресс.дц.
— Zdenek Sejcek 05

2
Думаю, вы тоже можете это сделатьimport sampleModule = module('modulename')
— mpen

Да, но node.d.ts в настоящее время находится на v0.8.8. Лучше использовать подход @Valentin, а затем использовать, скажем, IDE WebStorm, которая может загружать определения для версии Node, которую вы используете, и давать вам автозаполнение и т.д.
— Radek

@Radek Как ты это делаешь? Я использую WebStorm 7.0.2 (последний) Кстати, я не нашел скрипт node.d.ts, где он находится? Спасибо.
— Vadorequest

1
@Vadorequest, это должно помочь: jetbrains.com/webstorm/webhelp/…
— Radek

62

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

import sampleModule = require('modulename');

или

import * as sampleModule from 'modulename';

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

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

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


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

43

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

npm install --save-dev @types/node

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


1
У меня это тоже сработало! Но я не понимаю, что я установил его глобально (т.е. :), npm install -g @types/nodeно это не сработало?
— Jeach

Что делать, если модуль типов недоступен в npm?
— Судхаршан Наир,

@SudharshanNair есть много типов, определенных в проекте ОпределенноТипед. Другие варианты включают в себя продолжение объявления типов с определенным типом в вашем собственном проекте или использование без определения типов,
— rharriso

3

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

typings install env~node --global

Если у вас нет набора текста 😲 установите его:

npm install typings --global

20
Следует отметить, что набор текста не рекомендуется в пользу простогоnpm install @types/node --save-dev
— Майк Чемберлен
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.