Ошибка при получении TypeScript TS2304: невозможно найти имя 'require'
Я пытаюсь запустить и запустить мое первое приложение TypeScript и DefiniteTyped Node.js, и из-за некоторых ошибок.
Я получаю сообщение об ошибке "TS2304: не удается найти имя 'require'", когда я пытаюсь перенести простую страницу TypeScript Node.js. Я прочитал несколько других случаев этой ошибки на Qaru, и я не думаю, что у меня есть подобные проблемы.
Я запускаю в командной строке команду:
tsc movie.server.model.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.d.ts:
/// <reference path="node/node.d.ts" />
/// <reference path="requirejs/require.d.ts" />
Ссылки на файл .d.ts были помещены в соответствующие папки и добавлены в typings/tsd.d.ts с помощью команд:
tsd install node --save
tsd install require --save
Кажется, что созданный файл .js работает нормально, поэтому я мог проигнорировать ошибку. Но я был бы признателен, зная, почему возникает эта ошибка и что я делаю неправильно.
Ответы
Ответ 1
Быстро и грязно
Если у вас есть только один файл, использующий require, или вы делаете это для демонстрационных целей, вы можете определить require в верхней части вашего файла TypeScript.
declare var require: any
TypeScript 2.x
Если вы используете TypeScript 2.x, вам больше не нужно устанавливать Typings или Определенно набранные. Просто установите следующий пакет.
npm install @types/node --save-dev
Будущее файлов декларации (15.06.2016)
Такие инструменты, как Typings и TSD будут продолжать работать, и хорошо работать вместе с этими общинами, чтобы обеспечить плавный переход.
Проверьте или измените свой src/tsconfig.app.json так, чтобы он содержал следующее:
...
"types": [ "node" ],
"typeRoots": [ "../node_modules/@types" ]
...
Убедитесь, что файл находится в папке src, а не в корневой папке приложения.
По умолчанию любой пакет в @types уже включен в вашу сборку , если вы не указали ни один из этих параметров. Читать дальше
TypeScript 1.x
Используя наборы (замена DefiniteTyped), вы можете указать определение непосредственно из репозитория GitHub.
Установить наборы
npm install typings -g --save-dev
Установите определение типа requireJS из репозитория DefiniteType
typings install dt~node --save --global
Webpack
Если вы используете Webpack в качестве инструмента сборки, вы можете включить типы Webpack.
Установка npm --save-dev @types/webpack-env
Обновите свой tsconfig.json
следующим под compilerOptions
:
"types": [
"webpack-env"
]
Это позволяет вам выполнять require.ensure
и другие специфические функции Webpack.
Angular CLI
С помощью CLI вы можете выполнить описанный выше шаг Webpack и добавить блок "types" в свой tsconfig.app.json
.
В качестве альтернативы вы можете использовать предустановленные типы node
. Имейте в виду, что в ваш клиентский код будут включены дополнительные типы, которые на самом деле недоступны.
"compilerOptions": {
// other options
"types": [
"node"
]
}
Ответ 2
Для TypeScript 2.x теперь есть два шага:
-
Установите пакет, определяющий require
. Например:
npm install @types/node --save-dev
-
Сообщите TypeScript включить его глобально в tsconfig.json
:
{
"compilerOptions": {
"types": ["node"]
}
}
Второй шаг важен только в том случае, если вам нужен доступ к глобально доступным функциям, таким как require
. Для большинства пакетов вы должны просто использовать шаблон import package from 'package'
. Там нет необходимости включать каждый пакет в массив tsconfig.json выше.
Ответ 3
Вы можете
declare var require: any
Или для более полной поддержки используйте DefinitelyTyped require.d.ts
Кроме того, вместо var mongoose = require('mongoose')
вы можете попробовать следующее
import mongoose from 'mongoose' // or
import mongoose = require('mongoose')
Ответ 4
Этот ответ относится к современным настройкам (TypeScript 2.x, Webpack > 2.x)
Вам не нужно устанавливать @types/node (который относится ко всем типам Node.js и не имеет отношения к внешнему коду, фактически усложняя такие вещи, как setTimout различные возвращаемые значения и т.д.
Вам нужно установить @types/webpack-env
npm i -D @types/webpack-env
который дает подписи среды выполнения, которые есть у Webpack (включая require
, require.ensure
и т.д.)
Также убедитесь, что в вашем файле tsconfig.json нет установленного массива 'types' ->, что позволит ему получать все определения типов в папке node_modules/@types.
Если вы хотите ограничить поиск типов, вы можете установить для свойства typeRoot значение node_modules/@types.
Ответ 5
Вместо:
'use strict';
/// <reference path="typings/tsd.d.ts" />
Попробуйте:
/// <reference path="typings/tsd.d.ts" />
'use strict';
то есть. путь ссылки сначала.
Ответ 6
Я нашел решение использовать команду TSD:
tsd install node --save
Что добавляет/обновляет файл typings/tsd.d.ts
, и этот файл содержит все определения типов, которые требуются для приложения node.
В верхней части моего файла я помещаю ссылку на 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[];
}
Ответ 7
Просто для справки, я использую Angular 7.1.4, TypeScript 3.1.6, и единственное, что мне нужно сделать, это добавить эту строку в tsconfig.json
:
"types": ["node"], // within compilerOptions
Ответ 8
Я принял ответ Питера Варги, чтобы добавить declare var require: any;
и превратил его в универсальное решение, которое работает для всех файлов .ts в общем случае с помощью preprocess-loader:
-
установить препроцессор-загрузчик:
npm install preprocessor-loader
-
добавить загрузчика в ваш webpack.config.js(я использую ts-loader для обработки 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; })"
}]
}
Вы можете добавить более надежные require.d.ts таким же образом, но declare var require: any;
было достаточно в моей ситуации.
Обратите внимание, есть ошибка в препроцессоре 1.0.5, которая отсекает последнюю строку, поэтому просто убедитесь, что у вас есть дополнительная строка space return в конце, и вы будете в порядке.
Ответ 9
Я тоже борюсь с этой проблемой. Я считаю, что это работает для всех кандидатов на выпуск aka rc, но я не тестировал. Для @angular rc.2 он работает хорошо.
- Добавить
core-js
как зависимость от npm в package.json
- run
typings install core-js --save
- удалите все
"es6-shim"
события в package.json
. Вам это больше не нужно.
Ура!
Ответ 10
Иногда может отсутствовать "jasmine" из tsconfig.json. (TypeScript 2.X)
Так что добавьте
"types": [
"node",
"jasmine"
]
в ваш файл tsconfig.json
.
Ответ 11
Электрон + угловое 2/4 сложение:
Вдобавок к добавлению типа 'node' к различным файлам ts.config, в конечном итоге у меня получилось добавить следующее к
Файл typings.d.ts
:
declare var window: Window;
interface Window {
process: any;
require: any;
}
Обратите внимание, что мой случай развивается с помощью Electron + Angular 2/4. Мне нужно было запросить глобальное окно.
Ответ 12
Убедитесь, что вы установили npm я @types/node
Ответ 13
импорт * как мангуст из "мангуста"
Ответ 14
-
Вы указали, какой модуль использовать для пересылки кода?
tsc --target es5 --module commonjs script.ts
Вы должны сделать это, чтобы транспилер знал, что вы компилируете код NodeJS. Документы.
-
Вы также должны установить определения мангуста
tsd install mongoose --save
-
Не используйте var
для объявления переменных (если это необходимо, это очень редкий случай), вместо этого используйте let
. Подробнее об этом
Ответ 15
Я не мог получить ошибку 'require', чтобы уйти, используя любой из вышеперечисленных приемов.
Но я обнаружил, что проблема заключалась в том, что мои инструменты TypeScript для Visual Studio, где старая версия (1.8.6.0) и последняя версия на сегодняшний день (2.0.6.0).
Вы можете скачать последнюю версию инструментов с:
TypeScript для Visual Studio 2015
Ответ 16
В дополнение к кгатскому ответу, для TypeScript 1.x
Если вы все еще видите ошибки, укажите в параметрах вашего компилятора index.d.ts.
"files": [
"typings/index.d.ts"
]
Ответ 17
Если вы можете скомпилировать код, но Visual Studio 2015 помечает функции 'require', так как ошибки с текстом ошибки не могут найти имя 'require' или не могут разрешить символ 'require', обновите TypeScript для Visual Studio 2015 до последней версии (на данный момент 2.1. 5) и обновите ReSharper (если вы его используете) как минимум до версии 2016.3.2.
У меня была эта досадная проблема некоторое время, и я не мог найти решение, но в конце концов решил ее таким образом.
Ответ 18
Добавьте следующее в tsconfig.json
:
"typeRoots": [ "../node_modules/@types" ]
Ответ 19
У меня есть еще один ответ, который основывается на всех предыдущих, которые описывают npm install @types/node
и включают node
в tsconfig.json / compilerOptions / types
.
В моем случае у меня есть база tsConfig.json
и отдельная в приложении Angular, расширяющая эту:
{
"extends": "../../tsconfig.json",
"compilerOptions": {
"outDir": "../out-tsc/app",
"types": []
},
Моя проблема была пустой types
в этом tsconfi.app.json
- он забивает тот, что в базовой конфигурации.
Ответ 20
В моем случае это была супер глупая проблема, когда src/tsconfig.app.json
перекрывал настройку tsconfig.json
.
Итак, у меня было это в tsconfig.json
:
"types": [
"node"
]
А этот в src/tsconfig.app.json
:
"types": []
Я надеюсь, что кто-то посчитает это полезным, поскольку эта ошибка вызывала у меня седые волосы.
Ответ 21
Если вы столкнулись с этой проблемой в файле .ts, который существует только для того, чтобы предоставить вам некоторые постоянные значения, тогда вы можете просто
переименуйте файл .ts в файл .js
и ошибка не придет снова.