Ошибка получения TypeScript TS2304: не удается найти имя 'require'

Я пытаюсь запустить и запустить свое первое приложение TypeScript и DefinitherTyped Node.js и столкнулся с некоторыми ошибками.

Я получаю сообщение об ошибке «TS2304: не могу найти имя 'require'», когда пытаюсь преобразовать простую страницу TypeScript Node.js. Я прочитал несколько других случаев этой ошибки в Stack Overflow, и не думаю, что у меня есть подобные проблемы. Я запускаю в командной строке команду:

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 работает нормально, поэтому я могу проигнорировать ошибку. Но я был бы признателен за то, чтобы узнать, почему возникает эта ошибка и что я делаю не так.


person JerryKur    schedule 02.07.2015    source источник
comment
when I attempt to transpile a simple ts node page ‹как вы транспилируете ... какую утилиту   -  person basarat    schedule 02.07.2015
comment
Я просто запускаю в командной строке, набрав команду: tsc movie.server.model.ts. FWIW это на Mac.   -  person JerryKur    schedule 02.07.2015
comment
Та же проблема возникла в среде IDE, которую я использовал в Visual Studio Code. Я попробую это в другой моей IDE, IntelliJ. Я предположил, что переход к командной строке был самым чистым способом проверить эту проблему.   -  person JerryKur    schedule 02.07.2015
comment
stackoverflow.com/a/43129815/2106820   -  person Arfan Mirza    schedule 27.11.2017
comment
Как насчет import { mongoose } from 'mongoose'?   -  person FisNaN    schedule 03.02.2018


Ответы (22)


Быстро и грязно

Если у вас есть только один файл, использующий require, или вы делаете это в демонстрационных целях, вы можете определить require в верхней части файла TypeScript.

declare var require: any

TypeScript 2.x

Если вы используете TypeScript 2.x, вам больше не нужно устанавливать типизацию или определенно типизированный. Просто установите следующий пакет.

npm install @types/node --save-dev

Будущее файлов объявлений (6 / 15/2016)

Такие инструменты, как Typings и tsd, будут продолжать работать, и мы будем работать вместе с этими сообществами, чтобы обеспечить плавный переход.

Проверьте или отредактируйте свой src /tsconfig.app.json, чтобы он содержал следующее:

...
"types": [ "node" ],
"typeRoots": [ "../node_modules/@types" ]
...

Убедитесь, что файл находится в папке src, а не в корневой папке приложения.

По умолчанию любой пакет из @types уже включен в вашу сборку , если вы не указали любой из этих параметров. Подробнее…

TypeScript 1.x

Используя типизацию (замена DefinentyTyped), вы можете указать определение прямо из репозитория GitHub.

Установить набор текста

npm install typings -g --save-dev

Установите определение типа requireJS из репозитория DefinitherType

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.

Angular CLI

С помощью интерфейса командной строки вы можете выполнить описанный выше шаг Webpack и добавить блок типов в свой tsconfig.app.json.

В качестве альтернативы вы можете использовать предустановленные node типы. Имейте в виду, что это будет включать в ваш клиентский код дополнительные типы, которые на самом деле недоступны.

"compilerOptions": {
    // other options
    "types": [
      "node"
    ]
  }
person cgatian    schedule 12.03.2016
comment
почему бы просто не ввести команду install --save --ambient require? - person kutomer; 21.03.2016
comment
Отличное предложение. Я обновил ответ. Я не знал, что требуется. - person cgatian; 21.03.2016
comment
я получаю сообщение об ошибке с этим Unable to find "require" ("npm") in the registry. Требуется ли часть большего набора типов nodeJS? - person dcsan; 12.06.2016
comment
типизация v1.2.0 должна быть: typings install dt ~ require --save --global - person Paul J; 16.06.2016
comment
Я знаю, что это НЕПРАВИЛЬНО, поскольку это связано с типизацией для requireJS, а не с узлами, встроенными в require. возможно, это правильный ответ для некоторой вариации выходной цели ES5, но не для общего случая. - person dcsan; 26.08.2016
comment
У меня была аналогичная проблема, и этот ответ может помочь другим, кто хочет просто начать работу с node. также, если вы используете сценарий атома, убедитесь, что в вашем tsconfig есть "module": "commonjs", "moduleResolution": "node",. stackoverflow.com/a/37912109/1146785 - person dcsan; 28.08.2016
comment
@dcsan Вы правы. Я обновил ответ, чтобы отразить использование node.js вместо require. - person cgatian; 17.09.2016
comment
это не работает для меня с использованием TS2, похоже, что он каким-то образом не улавливает определения @ types / node. какие идеи почему? - person Dave Taylor; 24.10.2016
comment
Может быть что-то с вашей конфигурацией TypeScript. Попробуйте удалить tsconfig.json и воссоздать его с tsc --init, чтобы посмотреть, работает ли он. Вы также можете попробовать создать файл вручную (с помощью команды tsc), чтобы убедиться, что это просто среда IDE, которая не набирает ввод - person cgatian; 24.10.2016
comment
Пожалуйста, обратитесь к jordan awnser. В моем случае мне пришлось установить следующие @types, поэтому я добавил - ›типы: [node, es6-prom, core-js, jasmine]‹ - в compilerOptions в tsconfig.json - person Lothre1; 26.10.2016
comment
@ Lothre1 настройка этих параметров необходима только в том случае, если вы указали typeRoots или типы. Tsconfig по умолчанию подберет их автоматически. typescriptlang.org/docs/handbook/ - person cgatian; 26.10.2016
comment
НАКОНЕЦ избавился от ошибок! Я пропустил шаг добавления «типов» в tsconfig. Похоже, веб-шторм на секунду решит все. Спасибо!! - person mwilson; 12.11.2016
comment
Хм, следил за всеми твоими шагами, но мне говорит «нет». - person Mathijs Segers; 28.11.2016
comment
В вашем коде есть ошибка. Это не typeroots, а typeRoots с большой буквы R - person RPDeshaies; 14.02.2017
comment
Нет проблем, сэр! :) - person RPDeshaies; 15.02.2017
comment
Здесь тоже работает :) - person michael-mammut; 16.03.2017
comment
Для меня необязательный шаг не был таким уж необязательным. Несмотря на то, что раньше я не использовал шрифты. - person velop; 18.03.2017
comment
Я до сих пор не понимаю, почему мне пришлось писать @ types / node в качестве зависимости, когда Node.js глобально установлен на моем ПК? Какие-либо предложения? - person Seagull; 15.01.2018
comment
@Seagull @types/node - это определения TypeScript. Узел не включает их, да и не должен. - person cgatian; 16.01.2018
comment
Это npm install @types/node --save-dev и перезапуск для тупого VsCode! - person Legends; 16.03.2018
comment
Согласно документации, в параметрах компилятора должны быть указаны типы или typeRoots. Не оба. - person user5389726598465; 26.03.2018
comment
Я попытался ответить на этот вопрос, как дурак, и из-за этого все мое приложение, которое, по крайней мере, работало, взорвалось с 7 последовательными ошибками, в которых говорилось одно и то же ... TS2304: Не удается найти имя «require». Спешно отступая ... Проект Core 2 .Net VueJs Typescript ... попробуйте на свой страх и риск ' - person Clarence; 26.07.2018
comment
@Clarence, извини, что ответ не помог? - person cgatian; 27.07.2018
comment
Все еще получаю эту ошибку TS2304 в TSC 2.9.2 даже с этими идеями ответов. - person Ben Racicot; 08.08.2018
comment
Скорее всего, вы редактируете неправильный tsconfig.json. - person cgatian; 09.08.2018
comment
как насчет решения для TS версии 3, потому что выше не работает для angular 7 - person Daneel Yaitskov; 21.12.2018
comment
в моем случае для TS версии 3 и angular 7 мне пришлось поместить typings.d.ts в src, потому что на том же уровне с src он игнорируется молча. - person Daneel Yaitskov; 21.12.2018
comment
Обратите внимание, что есть 2 tsconfig, один в src и один в корне - person bormat; 19.04.2019
comment
У меня была аналогичная проблема, но единственное, что мне нужно было изменить, это цель. - person Urasquirrel; 13.07.2019
comment
УБЕДИТЕСЬ, ЧТО ВЫ - ›Отредактируйте свой src / tsconfig.app.j как тот, который находится в SRC, а не в корне папки приложения. - person Mauricio Gracia Gutierrez; 18.10.2019
comment
TYVM, это помогло мне понять, что я забыл обновить tsconfig.app.json и tsconfig.lib.json для своих библиотек, и именно поэтому у меня возникли проблемы. Веди меня по пути исправления! - person Andrew Karstaedt; 23.03.2020

Для TypeScript 2.x теперь нужно выполнить два шага:

  1. Установите пакет, определяющий require. Например:

    npm install @types/node --save-dev
    
  2. Скажите TypeScript включить его глобально в tsconfig.json:

    {
        "compilerOptions": {
            "types": ["node"]
        }
    }
    

Второй шаг важен только в том случае, если вам нужен доступ к глобально доступным функциям, таким как require. Для большинства пакетов вы должны просто использовать шаблон import package from 'package'. Нет необходимости включать каждый пакет в приведенный выше массив типов tsconfig.json.

person Jordan    schedule 08.09.2016
comment
Вы можете использовать lib для некоторых es5 github.com/Microsoft/TypeScript/wiki/ Eq: lib: [dom, es5, es2015.promise, es2015.collection] - person Leo Caseiro; 14.09.2016
comment
После добавления "types": ["jasmine", "hammerjs"] к tsconfig.js мне пришлось добавить и node. Спасибо, Джордан. - person Mikeumus; 20.09.2016
comment
Когда я следую этому совету, он прерывает весь мой импорт. Например, import express from "express"; теперь говорит мне, что мне нужно попробовать установить @ types / express или добавить для него файл .d.ts. - person austinthemassive; 11.10.2017
comment
Если у вас больше @types/..., чем просто @types/node папок, не добавляйте "types": ["node"] в tsconfig.json, потому что компилятор TypeScript опускает другие не упомянутые пакеты. Это нарушит разрешение типов ваших IDE. Здесь написано typescriptlang.org/docs/ справочник / - person Marecky; 30.03.2018
comment
Это решение работает для меня в ионном проекте без проблем, спасибо :) - person Fran Sandi; 05.05.2018
comment
Было бы неплохо, если бы типы / узел были объединены в TypeScript - person Codler; 28.08.2018

Вы можете

declare var require: any

Или, для более полной поддержки, воспользуйтесь require.d.ts от DefinentyTyped.

Кроме того, вместо var mongoose = require('mongoose') вы можете попробовать следующее

import mongoose from 'mongoose' // or
import mongoose = require('mongoose')
person ᆼᆺᆼ    schedule 07.07.2015
comment
Просто об использовании use strict в TypeScript: ответ на базарат и «Использовать Strict» необходимо в файле TypeScript?. В TypeScript необходимо использовать use strict. - person Eugene Bichel; 28.11.2015
comment
Хм, в соответствии с этим ответом в этом нет необходимости, но может быть полезно использовать "use strict", я отредактирую свой ответ - person ᆼᆺᆼ; 02.12.2015
comment
использование declare var require не решает реальной проблемы; просто скрывая это. - person My Stack Overfloweth; 04.10.2016
comment
@ Неправильно, имейте в виду, что это с 2015 года, и, кроме того, я бы сказал, что нет проблем, которые нужно исправить. TypeScript 2.0 теперь, конечно, элегантно решает эту проблему. - person ᆼᆺᆼ; 05.10.2016

В моем случае это была супер-глупая проблема, когда src/tsconfig.app.json переопределял настройку tsconfig.json.

Итак, у меня было это в tsconfig.json:

    "types": [
      "node"
    ]

И этот в src/tsconfig.app.json:

    "types": []

Я надеюсь, что кто-то сочтет это полезным, так как эта ошибка вызвала у меня седые волосы.

person h22a    schedule 15.09.2019
comment
Это проблема, с которой я столкнулся. Спасибо - person davy; 11.09.2020
comment
У нас была такая же проблема. Этот комментарий помогает включить узел в правильный файл; в нашем случае нам нужно настроить файл tsconfig.lib.json, потому что он был подмодулем основного проекта. - person Rogelio Blanco; 14.07.2021

Этот ответ относится к современным настройкам (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.

person Nadav SInai    schedule 15.03.2018
comment
это важное замечание, также убедитесь, что ваш tsconfig.json не имеет установленного массива 'types' - ›что заставит его подбирать все определения типов в вашей папке node_modules / @ types - person Marecky; 30.03.2018
comment
Требуются ли какие-либо другие шаги с подходом webpack? Я получаю сообщение об ошибке компиляции "error TS2580: Cannot find name" require ". - person jaycer; 25.01.2019

Вместо того:

'use strict';

/// <reference path="typings/tsd.d.ts" />

Пытаться:

/// <reference path="typings/tsd.d.ts" />

'use strict';

то есть сначала ссылочный путь.

person Hurricane    schedule 04.01.2016
comment
Работает, но вроде грязный IMO - он в основном скрывает ошибку, а не исправляет ее. Идеально подходит для демонстраций и быстрых скриптов, но не для продакшена - person Nino Filiu; 23.12.2018

Для справки я использую Angular 7.1.4, TypeScript 3.1.6, и единственное, что мне нужно сделать, это добавить эту строку в tsconfig.json:

    "types": ["node"], // within compilerOptions
person Hearen    schedule 02.02.2019
comment
сделал это. По-прежнему возникает эта ошибка: не удается найти имя "требуется". Вам нужно установить определения типов для узла? Попробуйте npm i @types/node, а затем добавьте node в поле типов в файле tsconfig. - установил npm. - person Suisse; 14.01.2020

Я нашел решение использовать команду 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[];
}
person AlexStack    schedule 25.01.2016
comment
У меня 404 не найдено - person bormat; 19.04.2019

Я взял ответ Питера Варги, чтобы добавить declare var require: any; и превратил его в универсальное решение, которое работает для всех файлов .ts в целом, используя загрузчик препроцесса:

  1. установить препроцессор-загрузчик:

    npm install preprocessor-loader
    
  2. добавьте загрузчик в свой webpack.config.js (я использую ts- загрузчик для обработки исходников TypeScript):

    module: {
        loaders: [{
            test: /\.tsx?$/,
            loader: 'ts-loader!preprocessor?file&config=preprocess-ts.json'
        }]
    }
  1. Добавьте конфигурацию, которая добавит обходной путь к каждому источнику:
{
    "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 есть ошибка, которая отключает последний line, поэтому просто убедитесь, что в конце у вас есть дополнительный пробел, и все будет в порядке.

person Benny Bottema    schedule 18.02.2016
comment
Почему это было отклонено? Он отвечает на вопрос и предлагает что-то новое и важное. Теперь вам не нужно изменять каждый файл индивидуально, чтобы удовлетворить требования транспилятора и веб-пакета. - person Benny Bottema; 19.02.2016
comment
Не могли бы вы объяснить шаг 3 еще? Я новичок и не знаю, где разместить этот код конфигурации. - person user441058; 12.06.2016
comment
@ user441058, проверьте страницу GitHub, шаг 3 посвящен основной конфигурации загрузчика препроцесса . - person Benny Bottema; 12.06.2016

У меня есть еще один ответ, основанный на всех предыдущих, которые описывают 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 - он затирает тот, который был в базовой конфигурации.

person HankCa    schedule 12.04.2019

Для меня это решается добавлением типов в параметры компилятора angular.

"angularCompilerOptions": {
"fullTemplateTypeCheck": true,
"strictInjectionParameters": true,
"types": [ "node" ]
}
person Farida Anjum    schedule 20.03.2020
comment
Он находится в tsconfig.json для всех, кто хочет знать. - person Stephen Zeng; 07.04.2020
comment
это для углового 9. - person Arun; 17.05.2020

Я тоже боролся с этой проблемой. Я считаю, что это работает для всех кандидатов на выпуск, также известных как rc, но я не тестировал их. Для @angular rc.2 это работает хорошо.

  1. Добавить core-js как зависимость npm в package.json
  2. запустить typings install core-js --save
  3. удалите все "es6-shim" вхождения в вашем package.json. Тебе это больше не нужно.

Ваше здоровье!

person kucherenkovova    schedule 21.06.2016
comment
для чего нужна типизация core-js? специфичен для узла? - person dcsan; 28.08.2016

Убедитесь, что вы установили npm i @types/node

person Rupesh Kumar Tiwari    schedule 24.08.2018

Иногда отсутствие «жасмина» в tsconfig.json может вызвать эту ошибку. (TypeScript 2.X)

Так что добавь

"types": [
  "node",
  "jasmine"
]

в ваш tsconfig.json файл.

person skaveesh    schedule 07.04.2017

Electron + добавление Angular 2/4:

Помимо добавления типа 'node' в различные файлы ts.config, в конечном итоге у меня сработало добавление следующего к файлу typings.d.ts:

declare var window: Window;
interface Window {
  process: any;
  require: any;
}

Обратите внимание, что мой случай разрабатывается с помощью Electron + Angular 2/4. Мне нужно было требование в глобальном окне.

person mihaa123    schedule 18.11.2017

  1. Вы указали, какой модуль использовать для транспиляции кода?
    tsc --target es5 --module commonjs script.ts
    Вы должны сделать это, чтобы транспилятор знал, что вы компилируете код NodeJS. Документы.

  2. Вы также должны установить определения мангуста
    tsd install mongoose --save

  3. Не используйте var для объявления переменных (без необходимости, что бывает очень редко), вместо этого используйте let. Подробнее об этом

person Ayman Nedjmeddine    schedule 19.07.2016

Просто в дополнение к ответу cgatian для TypeScript 1.x

Если вы по-прежнему видите ошибки, укажите index.d.ts в параметрах вашего компилятора.

"files": [
    "typings/index.d.ts"
]
person Vidish Datta    schedule 31.01.2017

Мне не удалось избавиться от ошибки «require» с помощью любого из описанных выше приемов.

Но я обнаружил, что проблема заключалась в том, что в моих инструментах TypeScript для Visual Studio старая версия (1.8.6.0) и последняя на сегодняшний день версия (2.0.6.0).

Вы можете скачать последнюю версию инструментов по адресу:

TypeScript для Visual Studio 2015

person Thomas    schedule 18.11.2016

Если вы можете скомпилировать код, но Visual Studio 2015 помечает функции 'require' как ошибки с текстом ошибки не удается найти имя 'require' или не удается разрешить символ 'require', обновите TypeScript для Visual Studio 2015 до последней версии (на данный момент 2.1.5) и обновите ReSharper (если вы его используете) как минимум до версии 2016.3.2.

Некоторое время у меня была эта неприятная проблема, и я не мог найти решения, но в конце концов решил ее таким образом.

person Mike Eshva    schedule 02.02.2017

Добавьте в tsconfig.json следующее:

"typeRoots": [ "../node_modules/@types" ]
person Darshan Ballal    schedule 06.10.2017
comment
Об этом уже упоминалось в ответе @ cgatian. - person tuomastik; 06.10.2017
comment
@cgatian упомянул node_modules / @ types, а я упомянул ../node_modules/@types. - person Darshan Ballal; 30.10.2017

В утвержденном ответе не упоминалась возможность фактически создать свой собственный файл типизации и импортировать его туда, позвольте мне добавить его ниже.

Предполагая, что вы используете npm в качестве диспетчера пакетов, вы можете:

npm i @types/node --save-dev

Затем в вашем файле tsconfig:

tsconfig.json

"include": ["typings.d.ts"],

Затем создайте свой файл типизации:

typings.d.ts

import 'node/globals'

Готово, ошибок больше нет, наслаждайтесь TypeScript :)

person Matt    schedule 20.09.2020

Если вы столкнулись с этой проблемой в файле .ts, который предназначен только для предоставления вам некоторых постоянных значений, вы можете просто

переименуйте ваш файл .ts в файл .js

и ошибка больше не повторится.

person Aavgeen singh    schedule 06.11.2018