TypeScript出现错误TS2304:找不到名称“ require”


462

我正在尝试启动并运行我的第一个TypeScript和DefinitelyTyped Node.js应用程序,并且遇到一些错误。

当我尝试转换一个简单的TypeScript Node.js页面时,出现错误“ TS2304:找不到名称'require'”。我已经阅读了Stack Overflow上此错误的其他几种情况,但我认为我没有类似的问题。我在shell提示符下运行命令:

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')行。

Types / tsd.d.ts文件的内容是:

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

.d.ts文件引用放置在适当的文件夹中,并通过以下命令添加到Types / tsd.d.ts中:

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

产生的.js文件似乎工作正常,因此我可以忽略该错误。但是,我很高兴知道为什么会发生此错误以及我在做什么错。


1
when I attempt to transpile a simple ts node page<您如何进行转码...哪个实用程序
basarat 2015年

1
我只是通过输入以下命令在命令行上运行:tsc movie.server.model.ts。FWIW这是在Mac上。
JerryKur

1
在我使用Visual Studio Code的IDE中也发生了相同的问题。我将在其他IDE(IntelliJ)上尝试一下。我认为拖放到命令行是测试此问题的最干净方法。
JerryKur


怎么import { mongoose } from 'mongoose'
FisNaN

Answers:


742

又快又脏

如果您只有一个文件使用require,或者出于演示目的而执行此操作,则可以在TypeScript文件的顶部定义require。

declare var require: any

TypeScript 2.x

如果您使用的是TypeScript 2.x,则不再需要安装Typings或Definitely Typed。只需安装以下软件包。

npm install @types/node --save-dev

声明文件的未来(6/15/2016)

诸如Typings和tsd之类的工具将继续起作用,我们将与这些社区一起工作,以确保顺利过渡。

验证或编辑您的src /tsconfig.app.json,使其包含以下内容:

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

确保该文件位于src文件夹中,而没有一个位于根应用程序文件夹中。

默认情况下,@ types下的任何软件包都已包含在您的内部版本中,除非您指定了这两个选项之一。 阅读更多

TypeScript 1.x

使用类型(DefinitelyTyped的替代),您可以直接从GitHub存储库中指定定义。

安装打字

npm install typings -g --save-dev

从DefinitelyType的仓库中安装requireJS类型定义

typings install dt~node --save --global

Webpack

如果将Webpack用作构建工具,则可以包括Webpack类型。

npm install --save-dev @ types / webpack-env

tsconfig.json使用以下内容更新您的compilerOptions

"types": [
      "webpack-env"
    ]

这使您可以执行require.ensureWebpack和其他特定于Web的功能。

角度CLI

使用CLI,您可以按照上面的Webpack步骤进行操作,然后将“ types”块添加到中tsconfig.app.json

或者,您可以使用预安装的node类型。请记住,这将包括客户端代码中实际上不可用的其他类型。

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

4
为什么不只是“键入install --save --ambient require”?
kutomer '16

1
我对此有一个错误Unable to find "require" ("npm") in the registry。require是更大的nodeJS类型集的一部分吗?
dcsan

7
我认为这是错误的,因为它与requireJS的类型相关,而不是节点的内置类型require。也许它是ES5输出目标的某些变化的正确答案,但不是一般情况。
dcsan

1
请参阅jordan awnser。在我的情况下,我不得不安装以下@types所以我说- > “类型”:[ “节点”, “ES6-承诺”, “核- js的”, “茉莉”] < -在tsconfig.json compilerOptions
Lothre1

1
@Seagull @types/node是TypeScript定义。Node不包括这些,也不应该包括。
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 types数组中包含每个包。


1
您可以使用LIB一些ES5 github.com/Microsoft/TypeScript/wiki/... 公式: “LIB”: “DOM”, “ES5”, “es2015.promise”, “es2015.collection”]
狮子座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

或者,要获得更全面的支持,请使用DefinitelyTyped的require.d.ts

另外,var mongoose = require('mongoose')您可以尝试以下方法来代替,

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

1
只是要use strict在TypeScript中使用:TypeScript文件中需要basarat答案“ Use Strict”?。有必要use strict在TypeScript中使用。
尤金·比切尔

嗯,根据该答案,这不是必需的,但使用起来可能会有所帮助"use strict",我将编辑我的答案
2015年

使用声明var require不能解决真正的问题;藏起来
我的堆栈

@Ant对,请记住,这是从2015年开始的,而且,我认为没有“问题”可以解决。TypeScript 2.0现在当然可以解决此问题
'16年

12

此答案与现代设置有关(TypeScript 2.x,Webpack > 2.x)

需要安装@类型/节点(这是所有类型的Node.js和是无关前端代码,实际上复杂的东西,如setTimout不同的返回值,等等。

确实需要安装@ types / webpack-env

npm i -D @types/webpack-env

它提供了Webpack具有的运行时签名(包括requirerequire.ensure等)

还要确保您的tsconfig.json文件没有设置“类型”数组->,这将使其在node_modules / @ types文件夹中拾取所有类型定义。

如果要限制类型的搜索,可以将typeRoot属性设置为node_modules / @ types。


1
这一点很重要,还请确保tsconfig.json没有设置“类型”数组->这将使其在您的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';

即先参考路径。


可以,但是有点脏的IMO-它基本上是隐藏错误而不是纠正错误。非常适合演示和快速脚本,但不适合制作
Nino Filiu

8

就我而言,这是一个超级愚蠢的问题,其中src/tsconfig.app.json被重写tsconfig.json设置。

所以,我在tsconfig.json

    "types": [
      "node"
    ]

而这个在src/tsconfig.app.json

    "types": []

我希望有人觉得这有帮助,因为此错误使我发白。


8

仅供参考,我使用的是Angular 7.1.4TypeScript 3.1.6,我唯一需要做的就是在此行中添加tsconfig.json

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

做过某事。仍然出现此错误:找不到名称“ require”。您是否需要为节点安装类型定义?尝试npm i @types/node将其添加node到tsconfig中的“类型”字段中。-是否安装了npm。
瑞士

7

我发现解决方案是使用TSD命令:

tsd install node --save

它将添加/更新typings/tsd.d.ts文件,并且该文件包含节点应用程序所需的所有类型定义。

在文件的顶部,我引用了tsd.d.ts以下内容:

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

从2016年1月起,需求定义如下:

declare var require: NodeRequire;

interface NodeModule {
    exports: any;
    require: NodeRequireFunction;
    id: string;
    filename: string;
    loaded: boolean;
    parent: any;
    children: any[];
}

我找不到404
bormat

5

我接受了Peter Varga的回答declare var require: any;并使用preprocess-loader将其添加到一个通用解决方案中,该解决方案通常适用于所有.ts文件:

  1. 安装预处理程序加载器:

    npm install preprocessor-loader
  2. 将加载程序添加到您的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中存在一个错误,该错误会截断最后一行,因此请确保在末尾有额外的行空间返回,并且您会没事的。


1
为什么这被否决?它回答了这个问题,并带来了新的重要意义。现在,您不必单独处理每个文件即可满足transpiler和webpack的需要。
Benny Bottema '16

您能否进一步说明第3步?我是新手,不知道将配置代码放在哪里。
user441058'6

@ user441058,签出GitHub页面,第3步是关于preloader -loader的主要配置。
Benny Bottema

2

我也在这个问题上苦苦挣扎。我相信这适用于所有发行候选版本 aka rc,但是我没有测试过。对于@angular rc.2,它可以很好地工作。

  1. 添加core-js为npm依赖项package.json
  2. typings install core-js --save
  3. 删除"es6-shim"您所有的事件package.json。您不再需要它。

干杯!


core-js的用途是什么?特定于节点?
dcsan




2

电子 +角2/4加法:

除了向ts.config中添加各种文件的“节点”类型之外,最终对我有用的是在typings.d.ts文件中添加下一个 :

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

请注意,我的案例是使用Electron + Angular 2/4开发的。我需要全局窗口上的需求。


2

对我来说,可以通过将类型添加到角度编译器选项中来解决。

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

任何人想知道的都在tsconfig.json中。
曾梵​​志

1
这是为角9.
阿伦

1
  1. 您是否指定了用于转码的模块?
    tsc --target es5 --module commonjs script.ts
    您必须执行此操作,以使编译器知道您正在编译NodeJS代码。文件

  2. 您还必须安装猫鼬定义
    tsd install mongoose --save

  3. 不要使用var声明变量(除非有必要,这是一种非常罕见的情况),请let改用。 进一步了解



1

通过使用以上任何技巧,我都无法摆脱“需要”错误。

但是我发现问题出在我的Visual Studio TypeScript工具上,其中旧版本(1.8.6.0)和最新版本是(2.0.6.0)。

您可以从以下位置下载工具的最新版本:

Visual Studio 2015的TypeScript


1

如果您可以编译代码,但是Visual Studio 2015将“需要”功能标记为带有错误文本的错误,则找不到名称“需要”无法解析符号“需要”,则将Visual Studio 2015的TypeScript更新到最新版本(当前为2.1)。 5)并将ReSharper(如果使用的话)更新到至少2016.3.2版。

我有一个烦人的问题一阵子,找不到解决方案,但是我终于以这种方式解决了。



1

我有另一个答案是建立在以前的不同,描述npm install @types/node和包括nodetsconfig.json / compilerOptions / types

就我而言,我tsConfig.json在Angular应用程序中有一个基础和一个单独的基础,用于扩展此基础:

{
    "extends": "../../tsconfig.json",
    "compilerOptions": {
        "outDir": "../out-tsc/app",
        "types": []
 },

我的问题是空types在这tsconfi.app.json-它则会覆盖了一个在基本配置。


-2

如果您在.ts文件中遇到此问题,而该文件只是为您提供一些常量值,那么您可以

将您的.ts文件重命名为.js文件

并且错误不会再次出现。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.