typescript получает ошибку TS2304: не удается найти имя "require"
Я пытаюсь получить свой первый Typescript и DefinitelyTyped node app и работает, и работает с некоторыми ошибками.
Я получаю ошибку "TS2304: не могу найти имя "require"", когда я пытаюсь транспилировать простую страницу узла ts. Я прочитал несколько других случаев этой ошибки на SO, и я не думаю, что у меня есть подобные проблемы.
Я запускаю в командной строке команды: TSC movie.сервер.модель.ts. Содержимое этого файла являются:
'use strict';
/// <reference path="typings/tsd.d.ts" />
/* movie.server.model.ts - definition of movie schema */
var mongoose = require('mongoose'),
Schema = mongoose.Schema;
var foo = 'test';
ошибка возникает в строке var mongoose=require('mongoose')
содержание typings / tsd.д.файл ТС являются:
/// <reference path="node/node.d.ts" />
/// <reference path="requirejs/require.d.ts" />
The .d.ссылки на файлы ts были помещены в соответствующие папки и добавлены в typings/tsd.д.ТС команды:
tsd install node --save
tsd install require --save
произведенного .JS-файл работает нормально, поэтому я могу игнорировать ошибку. Но я был бы признателен, если бы знал, почему эта ошибка возникает и что я делаю неправильно.
16 ответов
и
если у вас есть только один файл, использующий require, или вы делаете это для демонстрационных целей, вы можете определить require в верхней части файла TypeScript.
declare var require: any
машинопись 2.x
если вы используете TypeScript 2.x вам больше не нужно иметь типизации или определенно типизированные установлены. Просто установите следующий пакет.
npm install @types/node --save-dev
будущее декларацию файлов (6/15/2016)
инструменты, такие как Typings и tsd, будут продолжать работать, и мы будем работать наряду с этими общинами обеспечить плавный переход.
дополнительно:
Если вы указываете typeroots
или types
в своем tsconfig.json
. Возможно, вам потребуется обновить tsconfig.json
включить node в качестве типа. По умолчанию любой пакет под @types уже включен в вашу сборку если вы указали любой из этих параметров. подробнее
Ниже приведена правильная конфигурация для каждого из этих параметров.
{
"compilerOptions": {
// types option has been previously configured
"types": [
// add node as an option
"node"
],
// typeRoots option has been previously configured
"typeRoots": [
// add path to @types
"node_modules/@types"
]
}
}
машинопись 1.x
используя typings (замена DefinitelyTyped), вы можете указать определение непосредственно из репозитория GitHub.
установить typings
npm install typings -g --save-dev
установите определение типа requireJS из РЕПО DefinitelyType
typings install dt~node --save --global
Webpack
если вы используете Webpack в качестве инструмента сборки, вы можете включить в Webpack видах.
npm install --save-dev @types / webpack-env
обновить tsconfig.json
со следующим под compilerOptions
:
"types": [
"webpack-env"
]
это позволяет сделать require.ensure
и другие специфические функции Webpack.
угловой CLI
С CLI вы можете следовать шагу Webpack выше и добавить блок "типы" к вашему tsconfig.app.json
.
кроме того, вы можете использовать предустановленный node
типы. Имейте это в виду будет включать дополнительные типы кода на стороне клиента, которые на самом деле недоступны.
"compilerOptions": {
// other options
"types": [
"node"
]
}
Для TypeScript 2.x, теперь есть два шага:
-
установите пакет, который определяет
require
. Например:npm install @types/node --save-dev
-
скажите TypeScript включить его глобально в
tsconfig.json
:{ "compilerOptions": { "types": ["node"] } }
второй шаг важен, только если вам нужен доступ к глобально доступным функциям, таким как require
. Для большинства пакетов, вы должны просто использовать import package from 'package'
узор. Нет необходимости включать каждый пакет в tsconfig.массив типов json выше.
вы можете
declare var require: any
или, для более полной поддержки, используйте DefinitelyTyped требует.д.ТС
кроме того, вместо var mongoose = require('mongoose')
, вы можете попробовать следующие
import mongoose from 'mongoose' // or
import mongoose = require('mongoose')
вместо:
'use strict';
/// <reference path="typings/tsd.d.ts" />
попробуй:
/// <reference path="typings/tsd.d.ts" />
'use strict';
т. е. сначала путь ссылки.
я нашел решение использовать команду TSD:
tsd install node --save
добавляет/обновляет typings/tsd.d.ts
file и этот файл содержит все определения типов, необходимые для приложения узла.
в верхней части моего файла, я поставил ссылку на tsd.d.ts
такой:
/// <reference path="../typings/tsd.d.ts" />
требуются определен такой как января 2016 года:
declare var require: NodeRequire;
interface NodeModule {
exports: any;
require: NodeRequireFunction;
id: string;
filename: string;
loaded: boolean;
parent: any;
children: any[];
}
взял ответ Петра Варги добавить declare var require: any;
и сделал его в общее решение, которое работает для всех .TS файлы в целом с помощью предобработки-погрузчик:
-
установить препроцессор-загрузчик:
npm install preprocessor-loader
добавить загрузчик в свой webpack.конфиг.js (Я использую ТС-погрузчик для обработки TypeScript источники):
module: {
loaders: [{
test: /\.tsx?$/,
loader: 'ts-loader!preprocessor?file&config=preprocess-ts.json'
}]
}
- добавьте конфигурацию, которая добавит обходной путь к каждому источнику:
{
"line": false,
"file": true,
"callbacks": [{
"fileName": "all",
"scope": "source",
"callback": "(function shimRequire(source, fileName) { return 'declare var require: any;' + source; })"
}]
}
вы можете добавить более надежной требуют.д.ТС точно так же, но declare var require: any;
было достаточно в моей ситуации.
Примечание в препроцессоре 1.0.5, который отрезает последнюю строку, поэтому просто убедитесь, что у вас есть дополнительный пробел в конце, и вы будете штраф.
этот ответ относится к современным настройкам (typescript 2.x, webpack > 2.x)
вам не нужно устанавливать @types/node (который является всем узлом.JS и является irrelvant для интерфейсного кода, фактически усложняя такие вещи, как setTimout другое возвращаемое значение и т. д..
вам нужно установить @types / webpack-env
npm i -D @types/webpack-env
который дает подписи среды выполнения, которые имеет webpack (включая require и require.гарантировать так далее..)
убедитесь, что ваш tsconfig.JSON не имеет набора "типов" array ->, который сделает его пикапом всех определений типов в папке node_modules/@types. если вы хотите ограничить поиск типов, вы можете установить свойство typeRoot в node_modules / @types
иногда отсутствует "Жасмин" из tsconfig.JSON может вызвать эту ошибку. (Typescript 2.X)
добавьте
"types": [
"node",
"jasmine"
]
к вашему tsconfig.в JSON
Электрон + угловое добавление 2/4: Поверх добавления типа "узел" в ts.config различные файлы, что в конечном итоге сработало для меня, это добавление следующего вводы.д.файл ТС:
declare var window: Window;
interface Window {
process: any;
require: any;
}
обратите внимание, что мой случай развивается с electron + angular 2/4. Мне нужно было требование на глобальном окне.
я тоже боролся с этой проблемой. Я считаю, что это работает для всех релиз-кандидатов ака rc но я не тестировал, хотя. Для @angular rc.2 он работает хорошо.
- добавить
core-js
как зависимость npm вpackage.json
- выполнить
typings install core-js --save
- удалить все
"es6-shim"
происшествия вpackage.json
. Она тебе больше не нужна.
Ура!
вы указали, какой модуль использовать для транспилирования кода?
tsc --target es5 --module commonjs script.ts
Вы должны сделать это, чтобы транспилер знал, что вы компилируете код NodeJS. Docs.вы также должны установить определения мангуста
tsd install mongoose --save
не используйте
var
чтобы объявить переменные (если это не необходимо, что является очень редким случаем), используйте . подробнее о это
Я не мог получить ошибку "требовать", чтобы уйти, используя любой из трюков выше.
но я узнал, что проблема в том, что мои инструменты typescript для visual studio, где старая версия (1.8.6.0) и последняя версия на сегодняшний день (2.0.6.0)
вы можете скачать последнюю версию инструментов из:
https://www.microsoft.com/en-us/download/details.aspx?id=48593
просто в дополнение к ответу cgatian, для TypeScript 1.x
Если вы все еще видите ошибки, пожалуйста, укажите индекс.d.ts в параметрах компилятора.
"files": [
"typings/index.d.ts"
]
Если вы можете скомпилировать код, но Visual Studio 2015 помечает функции "require" как ошибки с текстом ошибки не удается найти имя 'require' или не удается разрешить символ 'require' обновить TypeScript для Visual Studio 2015 до последней версии (на данный момент 2.1.5) и обновить ReSharper (если вы его используете) по крайней мере до версии 2016.3.2.
У меня была эта раздражающая проблема некоторое время, не мог найти решение, но, наконец, решил его таким образом. Надеюсь, это поможет кто-то.