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

尝试时出现错误“ TS2304:找不到名称'require'“转换一个简单的TypeScript Node.js页面。我已经阅读了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')行上引发了错误。

类型/tsd.d.ts文件是:

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


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

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


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

评论

当我尝试编译一个简单的ts节点页面时<您如何编译...哪个实用程序

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

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

stackoverflow.com/a/43129815/2106820

从'猫鼬'导入{猫鼬}怎么样?

#1 楼

快速而肮脏
如果您只有一个文件使用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

安装requireJS类型来自DefinitelyType的repo的定义
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特定功能。
Angular CLI
使用CLI,您可以按照上面的Webpack步骤并在其中添加“ types”块您的tsconfig.app.json
或者,您可以使用预安装的node类型。请记住,这将包括您的客户端代码中实际上不可用的其他类型。
"compilerOptions": {
    // other options
    "types": [
      "node"
    ]
  }


评论


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

– Kutomer
16-3-21在11:15

我收到此错误,无法在注册表中找到“ require”(“ npm”)。 require是更大的nodeJS类型集的一部分吗?

–dcsan
16年6月12日在10:12

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

–dcsan
16年8月25日在22:07

请参考jordan awnser。在我的情况下,我安装了以下@types,所以我在tsconfig.json中的compileOptions中添加了->“ types”:[“ node”,“ es6-promise”,“ core-js”,“ jasmine”] <-

–Lothre1
16-10-26在8:22

@Seagull @ types / node是TypeScript定义。 Node不包含这些,也不应该包含这些。

– cgatian
18年1月15日在23:54

#2 楼

对于TypeScript 2.x,现在有两个步骤:



安装定义require的软件包。例如:

npm install @types/node --save-dev



告诉TypeScript将其全局包含在tsconfig.json中:

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



仅当需要访问诸如require之类的全局可用功能时,第二步才重要。对于大多数软件包,您应该只使用import package from 'package'模式。无需在上面的tsconfig.json types数组中包含每个包。

评论


您可以将lib用于某些es5github.com/Microsoft/TypeScript/wiki/…等式:“ lib”:[“ dom”,“ es5”,“ es2015.promise”,“ es2015.collection”]

– Leo Caseiro
16 Sep 14'0:40

在向tsconfig.js添加“ types”:[“ jasmine”,“ hammerjs”]之后,我也不得不添加节点。谢谢乔丹。

– Mikeikemus
16-09-20在7:38

当我遵循此建议时,它将中断我的所有导入。例如,从“ express”导入express;现在告诉我,我需要尝试安装@ types / express或为其添加.d.ts文件。

–austinthemassive
17-10-10在23:25



如果您的@types / ...比@ types / node文件夹多,请不要在tsconfig.json中添加“ types”:[“ node”],因为TypeScript编译器将省略其他未提及的软件包。这将破坏您的IDE类型解析。它写在这里typescriptlang.org/docs/handbook/…

– Marecky
18-3-30在7:06



该解决方案在离子项目中对我来说毫无问题,谢谢:)

– Fran Sandi
18年5月4日在23:58



#3 楼

您可以

declare var require: any


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

,而不是var mongoose = require('mongoose'),您可以尝试以下

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


评论


只是要在TypeScript中使用严格使用:TypeScript文件中需要basarat答案和“ Use Strict”?必须在TypeScript中使用use strict。

– Eugene Bichel
15年11月28日在19:54



嗯,根据该答案,虽然没有必要,但是使用“严格使用”可能会有所帮助,我将编辑我的答案

–ᆼᆺᆼ
15年2月2日在15:58

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

–我的堆栈溢出
16-10-4在19:39

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

–ᆼᆺᆼ
16-10-5在14:17

#4 楼

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

所以,我在tsconfig.json中有这个:

    "types": [
      "node"
    ]


src/tsconfig.app.json中有一​​个:

    "types": []


我希望有人能对此有所帮助,因为此错误使我发白了。

评论


这是我面临的问题。谢谢

–海军
9月11日7:19

#5 楼

此答案与现代设置(TypeScript 2.x,Webpack> 2.x)有关。您不需要安装@ types / node(这是所有Node.js类型,与以下内容无关)前端代码,实际上会使诸如setTimout不同的返回值之类的事情复杂化。

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

npm i -D @types/webpack-env

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

还要确保您的tsconfig.json文件没有设置的“类型”数组->它会提取node_modules / @ types文件夹中的所有类型定义。

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

评论


这一点很重要,还请确保tsconfig.json没有设置'types'数组->这将使其拾取node_modules / @ types文件夹中的所有类型定义

– Marecky
18-3-30在7:14



Webpack方法还需要其他步骤吗?我收到编译错误`错误TS2580:找不到名称'require'。

–骑兵
19年1月24日在21:01

#6 楼

代替:

 'use strict';

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


尝试:

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

'use strict';
 


ie首先参考路径。

评论


可以,但是有点脏的IMO-它基本上隐藏了错误,而不是进行纠正。非常适合演示和快速脚本,但不适用于生产

– Nino Filiu
18/12/23在13:52

#7 楼

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

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


评论


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

–瑞士
1月14日10:38



#8 楼

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

tsd install node --save


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

在文件顶部,我对tsd.d.ts的引用是这样的:

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


require的定义如下:自2016年1月起:

declare var require: NodeRequire;

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


评论


我找不到404

– Bormat
19年4月19日在18:39

#9 楼

我接受了彼得·瓦尔加(Peter Varga)的回答,添加了declare var require: any;,并使其成为通用的解决方案,该解决方案通过使用preprocess-loader通常适用于所有.ts文件:






npm install preprocessor-loader


将加载程序添加到您的webpack.config.js中(我正在使用ts-loader处理TypeScript源代码):

     module: {
        loaders: [{
            test: /\.tsx?$/,
            loader: 'ts-loader!preprocessor?file&config=preprocess-ts.json'
        }]
    }
 



添加配置,将变通方法添加到每个源:

 {
    "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中有一个错误,该错误会截断最后一行,因此,请确保在末尾有额外的行空间返回,然后您就可以了。

评论


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

– Benny Bottema
16年2月19日在17:04

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

–user441058
16年6月12日在7:57

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

– Benny Bottema
16年6月12日在17:03

#10 楼

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

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


评论


任何人想知道的都在tsconfig.json中。

–曾Step
4月7日下午4:45

这是角度9。

–阿伦
5月17日19:07

#11 楼

我也一直在努力解决这个问题。我相信这适用于所有发行候选版本aka rc,但是我没有测试过。对于@angular rc.2,它运行良好。


core-js中将package.json添加为npm依赖项

运行typings install core-js --save

删除所有"es6-shim"在您的package.json中发生。您不再需要它了。

干杯!

评论


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

–dcsan
16年8月28日在14:20

#12 楼

确保已安装npm i @types/node

#13 楼

有时从tsconfig.json中丢失“茉莉花”可能会导致此错误。 (TypeScript 2.X)

因此将

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


添加到您的tsconfig.json文件中。

#14 楼

Electron + Angular 2/4附加功能:

在向ts.config各种文件添加'node'类型的基础上,最终对我有用的是在
typings.d.ts文件中添加了下一个:

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


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

#15 楼

我还有另一个答案,该答案建立在所有先前描述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-它掩盖了基本配置中的一个。

#16 楼

import * as mongoose from 'mongoose'


#17 楼


您是否指定了用于转码的模块? tsc --target es5 --module commonjs script.ts
必须执行此操作,以使编译器知道您正在编译NodeJS代码。文档。
还必须安装猫鼬定义tsd install mongoose --save
请勿使用var声明变量(除非必要,这是非常罕见的情况),请改用let。进一步了解


#18 楼

除了cgatian的答案外,对于TypeScript 1.x

如果仍然看到错误,请在编译器选项中专门提供index.d.ts。

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


#19 楼

我无法通过使用上述任何技巧来消除'require'错误。

但是我发现问题是我的Visual Studio的TypeScript工具使用的是旧版本(1.8 .6.0)和今天的最新版本(2.0.6.0)。

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

#20 楼

如果您可以编译代码,但是Visual Studio 2015将'require'函数标记为错误,并且错误文本找不到名称'require'或无法解析符号'require',请将TypeScript for Visual Studio 2015更新到最新版本(目前为2.1)。 5)并将ReSharper(如果使用的话)更新到至少2016.3.2版。

我有一段时间遇到这个烦人的问题,找不到解决方案,但是我终于用这种方式解决了。

#21 楼

tsconfig.json中添加以下内容:

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


评论


@cgatian的答案中已经提到了这一点。

–tuomastik
17-10-6在7:53

@cgatian提到了“ node_modules / @ types”,而我提到了“ ../node_modules/@types”。

–Darshan Ballal
17-10-30在11:26

#22 楼

由于批准的答案没有提到实际创建自己的类型文件并将其导入的可能性,因此请在下面添加。
假设您使用npm作为包管理器,则可以:
npm i @types/node --save-dev

然后在您的tsconfig文件中:
tsconfig.json
"include": ["typings.d.ts"],

然后创建您的打字文件:
typings.d.ts
import 'node/globals'

完成,错误消失了,请享受TypeScript :)

#23 楼

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


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


,错误将不会再次出现。