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

349

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

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

  • 1
    when I attempt to transpile a simple ts node page TS <как вы переносите ... какая утилита
  • 0
    Я просто работаю в командной строке, набрав команду: tsc movie.server.model.ts. FWIW это на Mac.
Показать ещё 3 комментария
Теги:
definitelytyped

18 ответов

519
Лучший ответ

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

Если у вас есть только один файл, использующий 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"
    ]
  }
  • 3
    почему бы просто "набрать команду --save --ambient require"?
  • 0
    Отличное предложение. Я обновил ответ. Я не знал, что требование существует.
Показать ещё 28 комментариев
77

Для TypeScript 2.x теперь есть два шага:

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

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

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

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

  • 1
    Вы можете использовать lib для некоторых es5 github.com/Microsoft/TypeScript/wiki/… Eq: "lib": ["dom", "es5", "es2015.promise", "es2015.collection"]
  • 0
    После добавления "types": ["jasmine", "hammerjs"] в tsconfig.js я также хотел добавить node . Спасибо Джордан.
Показать ещё 4 комментария
66

Вы можете

declare var require: any

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

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

import mongoose from 'mongoose' // or
import mongoose = require('mongoose')
  • 1
    Просто об использовании use strict в TypeScript: ответ на языке basarat и «Use Strict» необходимы в файле TypeScript? , Необходимо use strict в TypeScript.
  • 0
    Хм, согласно этому ответу нет необходимости, но может быть полезно использовать "use strict" , я отредактирую свой ответ
Показать ещё 2 комментария
9

Вместо:

'use strict';

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

Попробуйте:

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

'use strict';

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

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

Я нашел решение использовать команду 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[];
}
6

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

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

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

npm я -D @types/webpack-env

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

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

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

Я принял ответ Питера Варги, чтобы добавить 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 в конце, и вы будете в порядке.

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

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

1

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

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

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

1

Иногда пропущенная "жасмин" из tsconfig.json может вызвать эту ошибку. (Typescript 2.X)

поэтому добавьте

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

на ваш tsconfig.json

1

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

  • Добавить core-js как зависимость от npm в package.json
  • run typings install core-js --save
  • удалите все "es6-shim" события в package.json. Вам это больше не нужно.

Ура!

  • 0
    для чего нужны наборы core-js? специфично для узла?
0

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

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

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

0

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

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

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

0

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

"typeRoots": [ "../node_modules/@types" ]
  • 2
    Это уже упомянуто в @ cgatian в ответ .
  • 0
    @cgatian упомянул «node_modules / @ types», а я упомянул «../node_modules/@types».
Показать ещё 1 комментарий
0

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

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

0

В дополнение к кгатскому ответу, для TypeScript 1.x

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

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

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

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

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

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

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню