TypeScript ошибка TS2304: не удается найти имя 'require'
Описание проблемы
Я пытаюсь настроить свое первое приложение на TypeScript и DefinitelyTyped для Node.js, но сталкиваюсь с некоторыми ошибками.
При попытке транскомпилировать простую страницу TypeScript для Node.js я получаю ошибку "TS2304: Cannot find name 'require'". Я прочитал несколько других случаев возникновения этой ошибки на Stack Overflow и не думаю, что у меня схожие проблемы.
Я запускаю команду в терминале:
tsc movie.server.model.ts
Содержимое этого файла следующее:
'use strict';
/// <reference path="typings/tsd.d.ts" />
/* movie.server.model.ts - определение схемы фильма */
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 файл, кажется, работает нормально, так что я мог бы игнорировать эту ошибку. Но я был бы признателен, если бы кто-то объяснил, почему возникает эта ошибка и что я делаю не так.
5 ответ(ов)
Для TypeScript 2.x необходимо выполнить два шага:
Установите пакет, который определяет
require
. Например:npm install @types/node --save-dev
Укажите TypeScript, чтобы он включил его глобально в
tsconfig.json
:{ "compilerOptions": { "types": ["node"] } }
Второй шаг важен только если вам нужен доступ к глобально доступным функциям, таким как require
. Для большинства пакетов вам следует использовать шаблон import package from 'package'
. Нет необходимости включать каждый пакет в массив типов tsconfig.json
, указанный выше.
В моем случае проблема была супер простой, и это была тупая ошибка, когда файл src/tsconfig.app.json
переопределял настройки из tsconfig.json
.
У меня в tsconfig.json
было следующее:
"types": [
"node"
]
А в src/tsconfig.app.json
было:
"types": []
Надеюсь, эта информация будет полезна кому-то, так как эта ошибка добавила мне немало седых волос.
Для справки, я использую Angular 7.1.4 и TypeScript 3.1.6. Для решения вашей проблемы необходимо добавить следующую строку в файл tsconfig.json
:
"types": ["node"] // внутри секции compilerOptions
Это позволит TypeScript правильно распознавать типы Node.js в вашем проекте.
Вместо:
'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
, в который включаются все определения типов, необходимые для приложения на Node.js.
В начале моего файла я добавил ссылку на tsd.d.ts
следующим образом:
/// <reference path="../typings/tsd.d.ts" />
На январь 2016 года определение require
выглядит так:
declare var require: NodeRequire;
interface NodeModule {
exports: any;
require: NodeRequireFunction;
id: string;
filename: string;
loaded: boolean;
parent: any;
children: any[];
}
Таким образом, вы сможете использовать типы в вашем Node.js приложении корректно.
Как предотвратить установку "devDependencies" модулей NPM для Node.js (package.json)?
Ошибка "npm WARN package.json: Нет поля repository"
Как протестировать один файл с помощью Jest?
nvm постоянно "забывает" Node.js в новой сессии терминала
Лучшие практики обработки исключений в Node.js