Ошибка при получении TypeScript TS2304: невозможно найти имя 'require'

463

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

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

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

JerryKur
источник
1
when I attempt to transpile a simple ts node page<Как дела ... какая утилита
Басарат
1
Я просто работаю в командной строке, набрав команду: tsc movie.server.model.ts. FWIW это на Mac.
JerryKur
1
Та же проблема возникла и в IDE, в которой я использовал код Visual Studio. Я попробую это в своей другой IDE, IntelliJ. Я предположил, что удаление в командную строку было самым чистым способом проверить эту проблему.
JerryKur
stackoverflow.com/a/43129815/2106820
Арфан Мирза
Как насчет import { mongoose } from 'mongoose'?
FisNaN

Ответы:

744

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

Если у вас есть только один файл, использующий 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 функции.

Угловой CLI

С CLI вы можете выполнить шаг Webpack выше и добавить блок «types» к вашему tsconfig.app.json.

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

"compilerOptions": {
    // other options
    "types": [
      "node"
    ]
  }
cgatian
источник
4
почему бы просто "набрать команду --save --ambient require"?
кутомер
1
я получаю ошибку с этим Unable to find "require" ("npm") in the registry. Требуется ли часть большего набора типографий nodeJS?
dcsan
7
я считаю, что это НЕПРАВИЛЬНО, поскольку оно связано с типизацией для requireJS, а не встроенным узлом require. возможно, это правильный ответ для некоторой вариации выходной цели ES5, но не для общего случая.
dcsan
1
Пожалуйста, обратитесь к Иордании. В моем случае я установил следующие @types, поэтому добавил -> "types": ["node", "es6-обещание", "core-js", "jasmine"] <- в compilerOptions в tsconfig.json
Lothre1
1
@Seagull @types/node- определения TypeScript. Узел не включает их, и они не должны.
cgatian
103

Для 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 выше.

Иордания
источник
1
Вы можете использовать lib для некоторых es5 github.com/Microsoft/TypeScript/wiki/… Уравнение: "lib": ["dom", "es5", "es2015.promise", "es2015.collection"]
Leo Caseiro
После добавления "types": ["jasmine", "hammerjs"]к tsconfig.jsя мастерил добавить nodeв колодце. Спасибо Джордан.
Mikeumus
Когда я следую этому совету, это нарушает весь мой импорт. Например, import express from "express";теперь говорит мне, что мне нужно попробовать установить @ types / express или добавить для нее файл .d.ts.
Austinthemassive
4
Если у Вас есть более @types/...чем просто @types/nodeпапка не добавлять "types": ["node"]в tsconfig.jsonпотому , что машинопись compiller опускает другие , не упомянутые пакеты. Это нарушит разрешение ваших типов IDE. Это написано здесь typescriptlang.org/docs/handbook/...
Marecky
Это решение работает для меня в ионном проекте без проблем, спасибо :)
Фрэн Сэнди
71

Вы можете

declare var require: any

Или, для более всесторонней поддержки, используйте requiretify.y.

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

import mongoose from 'mongoose' // or
import mongoose = require('mongoose')
ᆼ ᆺ ᆼ
источник
1
Просто об использовании use strictв TypeScript: базовый ответ и «Use Strict», необходимые в файле TypeScript? , Нужно использовать use strictв TypeScript.
Евгений Бичел
Хм, согласно этому ответу это не обязательно, но может быть полезно использовать "use strict", я отредактирую свой ответ
ᆼ ᆺ ᆼ
использование объявлять var require не решает реальную проблему; просто прячу это.
Мой стек переполнен
@ Правильно, имейте в виду, что это с 2015 года, а также, я бы сказал, что «проблем» не решить. TypeScript 2.0 теперь решает это элегантно, конечно
ᆼ ᆺ ᆼ
12

Этот ответ относится к современным настройкам (TypeScript 2.x, Webpack > 2.x)

Вам не нужно устанавливать @ types / node (который является типом Node.js и не имеет отношения к внешнему коду, фактически усложняя такие вещи, как setTimout, различные возвращаемые значения и т. Д.).

Вы делаете необходимость установки @ типов / WebPack-окр

npm i -D @types/webpack-env

которая дает подпись во время выполнения , что Webpack имеет ( в том числе require, require.ensureи т.д.)

Также убедитесь, что ваш файл tsconfig.json не имеет установленного массива 'types' ->, что позволит ему получать все определения типов в вашей папке node_modules / @ types.

Если вы хотите ограничить поиск типов, вы можете установить для свойства typeRoot значение node_modules / @ types.

Надав синай
источник
1
это важное замечание также убедитесь, что ваш tsconfig.json не имеет установленного массива 'types' ->, что позволит ему получать все определения типов в вашей папке node_modules / @ types
Marecky
Есть ли какие-либо другие шаги, необходимые с подходом webpack? Я получаю ошибку компиляции `ошибка TS2580: не удается найти имя 'require'`
jaycer
10

Вместо:

'use strict';

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

Пытаться:

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

'use strict';

т.е. ссылочный путь первым.

ураганный
источник
Работает, но вроде грязного ИМО - в основном скрывает ошибку, а не исправляет ее. Идеально
подходит
8

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

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

    "types": [
      "node"
    ]

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

    "types": []

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

h22a
источник
8

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

    "types": ["node"], // within compilerOptions
Hearen
источник
сделал это. По-прежнему получена эта ошибка: не удается найти имя «требуют». Вам нужно установить определения типа для узла? Попробуйте, npm i @types/nodeа затем добавьте nodeв поле типов в вашем tsconfig. сделал npm установить.
Suisse
7

Я нашел решение было использовать команду 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[];
}
AlexStack
источник
Я получил 404 не найден
bormat
5

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

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

Бенни Боттема
источник
1
Почему это было отвергнуто? Он отвечает на вопрос и вносит что-то новое и значимое в таблицу. Теперь вам не нужно манипулировать каждым файлом индивидуально, чтобы удовлетворить транспортер и веб-пакет.
Бенни Боттема
Можете ли вы объяснить шаг 3 больше? Я новичок и не знаю, куда поместить этот код конфигурации.
user441058
@ user441058, извлеките страницу GitHub , шаг 3 посвящен основной конфигурации загрузчика препроцесса.
Бенни Боттема
2

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

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

Ура!

kucherenkovova
источник
для чего нужны наборы core-js? специфичные для узла?
dcsan
2

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

Рупеш Кумар Тивари
источник
2

импорт * как мангуст из «мангуста»

basquith16
источник
2

Иногда может отсутствовать "jasmine" из tsconfig.json. (TypeScript 2.X)

Так добавь

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

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

Саминта Кавиш
источник
2

электрон + Угловое 2/4 сложение:

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

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

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

mihaa123
источник
2

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

"angularCompilerOptions": {
"fullTemplateTypeCheck": true,
"strictInjectionParameters": true,
"types": [ "node" ]
}
Фарида Анжум
источник
Это в tsconfig.json для всех, кто хочет знать.
Стивен Зенг
1
это для угловых 9.
Арун
1
  1. Вы указали, какой модуль использовать для переноса кода?
    tsc --target es5 --module commonjs script.ts
    Вы должны сделать это, чтобы транспортер знал, что вы компилируете код NodeJS. Docs .

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

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

Айман Неджмеддин
источник
1

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

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

"files": [
    "typings/index.d.ts"
]
Видиш Датта
источник
1

Я не мог получить ошибку 'require', чтобы уйти, используя любой из трюков выше.

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

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

TypeScript для Visual Studio 2015

Томас
источник
1

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

У меня была эта досадная проблема какое-то время, и я не мог найти решение, но наконец решил ее таким образом.

Майк Эшва
источник
1

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

"typeRoots": [ "../node_modules/@types" ]
Даршан Балал
источник
2
Это уже упомянуто в @ cgatian в ответ .
tuomastik
@cgatian упомянул «node_modules / @ types», а я упомянул «../node_modules/@types».
Даршан Балэл
1

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

HankCa
источник
-2

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

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

и ошибка не придет снова.

Авгин Сингх
источник