打字稿出错TS2304:找不到名字'require'

我试图让我的第一个Typescript和DefinitelyTyped节点应用程序启动并运行,并遇到一些错误。

当我尝试传输一个简单的ts节点页时,出现错误“TS2304:找不到名称'require'”。 我已经读过了这个错误的其他几个事件,我不认为我有类似的问题。
我在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')行会引发错误

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文件似乎工作正常,所以我可以忽略错误。 但我很感激知道为什么会发生这个错误,我做错了什么。

TypeScript 2.x

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

 npm install @types/node --save-dev 

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

像Typings和tsd等工具将继续工作,我们将与这些社区一起工作,以确保顺利过渡。

可选:如果您在typeroots中指定了typerootstypes 。 您可能需要更新tsconfig.json以包含节点作为types。 默认情况下,任何在@types下的包都已经包含在你的构build中, 除非你已经指定了这些选项。 阅读更多

以下是每个选项的正确configuration。

 { "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

使用types(DefinitelyTyped的replace),您可以直接从GitHub存储库指定定义。

安装types

 npm install typings -g --save-dev 

从DefinitelyType的回购安装requireJStypes定义

 typings install dt~node --save --global 

快速和肮脏

如果你只有一个使用require的文件,或者你正在做这个演示的目的,你可以在你的TypeScript文件的顶部定义require。

 declare var require: any 

Angular CLI

如果您尝试在Angular CLI项目中使用require语句,请更新tsconfig.app.json以包含节点types。

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

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

  1. 安装一个定义require的包。 例如:

     npm install @types/node --save-dev 
  2. 告诉TypeScript将其全局包含在tsconfig.json

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

如果您需要访问全球可用的function(例如, require第二步就非常重要。 对于大多数包,你应该只使用import package from 'package'模式的import package from 'package' 。 没有必要在上面的tsconfig.jsontypes数组中包含每个包。

您可以

 declare var require: any 

或者,为了更全面的支持,使用DefinitelyTyped的require.d.ts

此外,而不是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'; 

即首先参考path。

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

 tsd install node --save 

其中添加/更新typings/tsd.d.ts文件,该文件包含节点应用程序所需的所有types定义。

在我的文件顶部,我提到了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[]; } 

我拿Peter Varga的回答来添加declare var require: any; 并通过使用预处理装载器将它变成一个通用的解决scheme,通用于所有.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. 添加将解决方法添加到每个来源的configuration:
 { "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中存在一个缺陷 ,它会切断最后一行,所以只要确保在最后有一个额外的行空间返回,就可以了。

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

所以添加

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

到你的tsconfig.json

我一直在努力解决这个问题。 我相信,这适用于所有发布候选人 aka rc但我没有testing是。 对于@angular rc.2来说,它运行良好。

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

干杯!

  1. 你有没有指定使用什么模块来传输代码?
    tsc --target es5 --module commonjs script.ts
    您必须这样做才能让转译人员知道您正在编译NodeJS代码。 文档

  2. 您也必须安装mongoose定义
    tsd install mongoose --save

  3. 不要使用var声明variables(除非必要,这是非常罕见的情况),请使用let来代替。 了解更多

我无法通过使用上面的任何技巧来得到“要求”错误。

但我发现问题是,我的打字工具的视觉工作室,旧版本(1.8.6.0)和当今最新版本是(2.0.6.0)

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

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

除了cgatian的回答,还有TypeScript 1.x

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

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

如果您可以编译代码,但Visual Studio 2015将错误文本中的“require”函数标记为错误, 则无法find名称'require'无法parsing符号'require'将Visual Studio 2015的TypeScript更新为最新版本(目前为2.1.5)并更新ReSharper(如果使用的话)至less版本2016.3.2。

我有一段时间这个烦人的问题,找不到解决scheme,但最终解决这个问题。 希望这有助于某人。

tsconfig.json添加以下tsconfig.json

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