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

Я пытаюсь запустить и запустить мое первое приложение для узлов Typescript и DefiniteTyped и столкнуться с некоторыми ошибками.

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

24 ответа

Решение

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

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

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

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"
    ]
  }

Для 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

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

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

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

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

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

    "types": [
      "node"
    ]

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

    "types": []

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

Этот ответ относится к современным настройкам (машинопись 2.x, веб-пакет> 2.x)

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

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

npm i -D @types/webpack-env

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

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

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

    "types": ["node"], // within compilerOptions

Надеюсь, это поможет.

Вместо:

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

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

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

"angularCompilerOptions": {
"fullTemplateTypeCheck": true,
"strictInjectionParameters": true,
"types": [ "node" ]
}

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

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

npm i @types/node --save-dev

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

tsconfig.json

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

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

typings.d.ts

import 'node/globals'

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

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

Импорт * как мангуст из "мангуста"

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

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

Ура!

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

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

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

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

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

так добавь

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

на ваш tsconfig.json

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Если вы используете Yarn v3 и видите эту ошибку (не удается найти требуемое имя) или другие связанные с узлом ошибки «не удается найти» в VSCode, убедитесь, что у вас установлен подключаемый модуль Yarn VSCode sdk и выбрана рабочая версия Typescript.

Команда для установки SDKS:

      yarn dlx @yarnpkg/sdks

Чтобы установить версию Typescript:

  1. Выберите файл машинописного текста
  2. Нажмите Command + Shift + P
  3. Введите машинописный текст: выберите версию машинописного текста
  • Выберите «Использовать версию рабочей области».

Подробнее см. https://yarnpkg.com/getting-started/editor-sdks#vscode .

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

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

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

Другие вопросы по тегам