Ошибка при получении 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'
        }]
    }
  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, которая отсекает последнюю строку, поэтому просто убедитесь, что у вас есть дополнительная строка 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

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