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

Я пытаюсь получить свой первый Typescript и DefinitelyTyped node app и работает, и работает с некоторыми ошибками.

Я получаю ошибку "TS2304: не могу найти имя "require"", когда я пытаюсь транспилировать простую страницу узла ts. Я прочитал несколько других случаев этой ошибки на SO, и я не думаю, что у меня есть подобные проблемы.
Я запускаю в командной строке команды: TSC movie.сервер.модель.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.д.файл ТС являются:

/// <reference path="node/node.d.ts" />
/// <reference path="requirejs/require.d.ts" />

The .d.ссылки на файлы ts были помещены в соответствующие папки и добавлены в typings/tsd.д.ТС команды:

tsd install node --save
tsd install require --save

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

16 ответов


и

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

declare var require: any

машинопись 2.x

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

npm install @types/node --save-dev

будущее декларацию файлов (6/15/2016)

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

дополнительно: Если вы указываете typeroots или types в своем tsconfig.json. Возможно, вам потребуется обновить tsconfig.json включить node в качестве типа. По умолчанию любой пакет под @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"
         ]
    }
}

машинопись 1.x

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

установить typings

npm install typings -g --save-dev

установите определение типа requireJS из РЕПО DefinitelyType

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.

угловой CLI

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

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

"compilerOptions": {
    // other options
    "types": [
      "node"
    ]
  }

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


вы можете

declare var require: any

или, для более полной поддержки, используйте DefinitelyTyped требует.д.ТС

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

import mongoose from 'mongoose' // or
import mongoose = require('mongoose')

вместо:

'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 file и этот файл содержит все определения типов, необходимые для приложения узла.

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

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

    npm install preprocessor-loader
    
  2. добавить загрузчик в свой webpack.конфиг.js (Я использую ТС-погрузчик для обработки 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; })"
    }]
}

вы можете добавить более надежной требуют.д.ТС точно так же, но declare var require: any; было достаточно в моей ситуации.

Примечание в препроцессоре 1.0.5, который отрезает последнюю строку, поэтому просто убедитесь, что у вас есть дополнительный пробел в конце, и вы будете штраф.


этот ответ относится к современным настройкам (typescript 2.x, webpack > 2.x)

вам не нужно устанавливать @types/node (который является всем узлом.JS и является irrelvant для интерфейсного кода, фактически усложняя такие вещи, как setTimout другое возвращаемое значение и т. д..

вам нужно установить @types / webpack-env

npm i -D @types/webpack-env

который дает подписи среды выполнения, которые имеет webpack (включая require и require.гарантировать так далее..)

убедитесь, что ваш tsconfig.JSON не имеет набора "типов" array ->, который сделает его пикапом всех определений типов в папке node_modules/@types. если вы хотите ограничить поиск типов, вы можете установить свойство typeRoot в node_modules / @types


иногда отсутствует "Жасмин" из tsconfig.JSON может вызвать эту ошибку. (Typescript 2.X)

добавьте

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

к вашему tsconfig.в JSON


Электрон + угловое добавление 2/4: Поверх добавления типа "узел" в ts.config различные файлы, что в конечном итоге сработало для меня, это добавление следующего вводы.д.файл ТС:

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

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


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


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

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

Ура!


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

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

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


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

но я узнал, что проблема в том, что мои инструменты typescript для visual studio, где старая версия (1.8.6.0) и последняя версия на сегодняшний день (2.0.6.0)

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

https://www.microsoft.com/en-us/download/details.aspx?id=48593


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

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

"files": [
    "typings/index.d.ts"
]

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

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


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

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