Ошибка при получении машинописи TS2304: не удается найти имя ' require'
Я пытаюсь запустить и запустить мое первое приложение для узлов Typescript и DefiniteTyped и столкнуться с некоторыми ошибками.
Я получаю сообщение об ошибке "TS2304: не удается найти имя 'require' ", когда я пытаюсь перенести простую страницу узла ts. Я прочитал несколько других случаев этой ошибки на SO, и я не думаю, что у меня есть подобные проблемы.
Я запускаю в командной строке команду: 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, кажется, работает нормально, поэтому я мог проигнорировать ошибку. Но я был бы признателен, зная, почему возникает эта ошибка и что я делаю неправильно.
24 ответа
Быстро и грязно
Если у вас есть только один файл, использующий 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, будут продолжать работать, и мы будем работать вместе с этими сообществами, чтобы обеспечить плавный переход.
ДОПОЛНИТЕЛЬНО: если вы указываете typeroots
или же types
в вашем tsconfig.json
, Возможно, вам придется обновить tsconfig.json
включить узел как тип. По умолчанию любой пакет в @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"
]
}
}
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.
Угловой CLI
С CLI вы можете выполнить шаг Webpack выше и добавить блок "types" в ваш 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
Или, для более всесторонней поддержки, используйте requiretify.y.
Кроме того, вместо var mongoose = require('mongoose')
, вы можете попробовать следующее
import mongoose from 'mongoose' // or
import mongoose = require('mongoose')
В моем случае это была супер-глупая проблема, когда src/tsconfig.app.json
подавлял tsconfig.json
настройка.
Итак, у меня было это в tsconfig.json
:
"types": [
"node"
]
И этот в src/tsconfig.app.json
:
"types": []
Надеюсь, кто-то сочтет это полезным, так как эта ошибка вызвала у меня седые волосы.
Этот ответ относится к современным настройкам (машинопись 2.x, веб-пакет> 2.x)
Вам не нужно устанавливать @types/node (который является типом node.js и не имеет отношения к внешнему коду, фактически усложняя такие вещи, как setTimout, другое возвращаемое значение и т. д.).
вам нужно установить @types/webpack-env
npm i -D @types/webpack-env
который дает подписи времени выполнения, которые есть у веб-пакета (включая require и require.ensure и т. д.)
также убедитесь, что ваш tsconfig.json не имеет установленного массива 'types' ->, что позволит ему получать все определения типов в вашей папке node_modules/@types. если вы хотите ограничить поиск типов, вы можете установить свойство typeRoot для node_modules/@types
Просто для справки, я использую Angular 7.1.4, машинописный текст 3.1.6, и единственное, что мне нужно сделать, это добавить эту строку в tsconfig.json
"types": ["node"], // within compilerOptions
Надеюсь, это поможет.
Вместо:
'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
файл и этот файл содержит все определения типов, которые требуются для приложения узла.
Вверху моего файла я поместил ссылку на 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 в общем, используя preprocess-loader:
установить препроцессор-загрузчик:
npm install preprocessor-loader
добавьте загрузчик в ваш webpack.config.js (я использую ts-загрузчик для обработки источников 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 есть ошибка, которая обрезает последнюю строку, поэтому просто убедитесь, что у вас есть дополнительный пробел в конце, и все будет в порядке.
Для меня это решается добавлением типов в параметры компилятора angular.
"angularCompilerOptions": {
"fullTemplateTypeCheck": true,
"strictInjectionParameters": true,
"types": [ "node" ]
}
В утвержденном ответе не упоминалась возможность фактически создать свой собственный файл типизации и импортировать его туда, позвольте мне добавить его ниже.
Предполагая, что вы используете npm в качестве диспетчера пакетов, вы можете:
npm i @types/node --save-dev
Затем в вашем файле tsconfig:
tsconfig.json
"include": ["typings.d.ts"],
Затем создайте свой файл типизации:
typings.d.ts
import 'node/globals'
Готово, ошибок больше нет, наслаждайтесь TypeScript:)
У меня есть еще один ответ, который основывается на всех предыдущих, которые описывают 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
- это забивает тот, что в базовой конфигурации.
Я тоже боролся с этой проблемой. Я считаю, что это работает для всех кандидатов на релиз, иначе я не проверял, хотя. Для @angular rc.2 это работает хорошо.
- добавлять
core-js
в зависимости от npm вpackage.json
- бежать
typings install core-js --save
- удалить все
"es6-shim"
происшествия в вашемpackage.json
, Тебе это больше не нужно.
Ура!
Добавление Electron + angular 2/4. Помимо добавления типа 'node' к различным файлам ts.config, в конечном итоге у меня получилось добавить следующее к файлу typings.d.ts:
declare var window: Window;
interface Window {
process: any;
require: any;
}
Обратите внимание, что мой случай развивается с электронным + угловым 2/4. Мне нужно было запросить глобальное окно.
Иногда может отсутствовать "jasmine" из tsconfig.json. (Машинопись 2.X)
так добавь
"types": [
"node",
"jasmine"
]
на ваш tsconfig.json
Просто в дополнение к ответу cgatian, для TypeScript 1.x
Если вы все еще видите ошибки, пожалуйста, укажите index.d.ts в опциях вашего компилятора.
"files": [
"typings/index.d.ts"
]
Добавить следующее в tsconfig.json
:
"typeRoots": [ "../node_modules/@types" ]
Я не мог получить ошибку 'require', чтобы уйти, используя любой из уловок выше.
но я обнаружил, что проблема заключалась в том, что мои инструменты машинописи для Visual Studio, где старая версия (1.8.6.0) и последняя на сегодня версия (2.0.6.0)
Вы можете скачать последнюю версию инструментов с:
https://www.microsoft.com/en-us/download/details.aspx?id=48593
Вы указали, какой модуль использовать для переноса кода?
tsc --target es5 --module commonjs script.ts
Вы должны сделать это, чтобы транспортер знал, что вы компилируете код NodeJS. ДокументыВы должны также установить определения мангуста
tsd install mongoose --save
Не использовать
var
чтобы объявить переменные (если в этом нет необходимости, что очень редко), используйтеlet
вместо. Узнайте больше об этом
Если вы можете скомпилировать код, но Visual Studio 2015 помечает функции 'require', поскольку ошибки с текстом ошибки не могут найти имя 'require' или не могут найти символ 'require', обновите TypeScript для Visual Studio 2015 до последней версии (на данный момент 2.1.5) и обновите ReSharper (если вы его используете) по крайней мере до версии 2016.3.2.
У меня была эта досадная проблема некоторое время, я не мог найти решение, но наконец решил ее таким образом. Надеюсь, это кому-нибудь поможет.
Если вы используете Yarn v3 и видите эту ошибку (не удается найти требуемое имя) или другие связанные с узлом ошибки «не удается найти» в VSCode, убедитесь, что у вас установлен подключаемый модуль Yarn VSCode sdk и выбрана рабочая версия Typescript.
Команда для установки SDKS:
yarn dlx @yarnpkg/sdks
Чтобы установить версию Typescript:
- Выберите файл машинописного текста
- Нажмите Command + Shift + P
- Введите машинописный текст: выберите версию машинописного текста
- Выберите «Использовать версию рабочей области».
Подробнее см. https://yarnpkg.com/getting-started/editor-sdks#vscode .
Если вы столкнулись с этой проблемой в файле ts, который предоставляет только некоторые постоянные значения, то вы можете просто
переименуйте ваш файл.ts в файл.js
и ошибка не придет снова.