我正在尝试启动并运行个人第一个TypeScript和DefinitelyTyped Node.js应用程序,而且遇到一些错误。 html
尝试转换简单的TypeScript Node.js页面时,出现错误“ TS2304:找不到名称'require'”。 我已经阅读了Stack Overflow上此错误的其余几种状况,但我认为我没有相似的问题。 我在shell提示符下运行命令: node
tsc movie.server.model.ts.
该文件的内容是: webpack
'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')
行上引起。 git
Types / tsd.d.ts文件的内容是: github
/// <reference path="node/node.d.ts" /> /// <reference path="requirejs/require.d.ts" />
.d.ts文件引用放置在适当的文件夹中,并经过如下命令添加到Types / tsd.d.ts中: web
tsd install node --save tsd install require --save
产生的.js文件彷佛工做正常,所以我能够忽略该错误。 可是,我很高兴知道为何会发生此错误以及我在作什么错。 typescript
您能够 shell
declare var require: any
或者,要得到更全面的支持,请使用DefinitelyTyped的require.d.ts npm
另外,您能够尝试如下方法,而不是var mongoose = require('mongoose')
json
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';
即先参考路径。
我发现解决方案是使用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[]; }
我接受了彼得·瓦尔加(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中存在一个错误 ,该错误会截断最后一行,所以请确保在末尾有额外的行空间返回,而且您会很好。
若是您只有一个文件使用require,或者出于演示目的而执行此操做,则能够在TypeScript文件的顶部定义require。
declare var require: any
若是您使用的是TypeScript 2.x,则再也不须要安装Typings或Definitely Typed。 只需安装如下软件包。
npm install @types/node --save-dev
诸如Typings和tsd之类的工具将继续起做用,咱们将与这些社区一块儿工做,以确保顺利过渡。
验证或编辑您的src /tsconfig.app.json,使其包含如下内容:
... "types": [ "node" ], "typeRoots": [ "../node_modules/@types" ] ...
确保该文件位于src文件夹中,而没有一个位于根应用程序文件夹中。
默认状况下, 除非您指定了这些选项中的任何一个, 不然 @types下的任何软件包都已包含在您的版本中。 阅读更多
使用类型(DefinitelyTyped的替代),您能够直接从GitHub存储库中指定定义。
安装打字
npm install typings -g --save-dev
从DefinitelyType的仓库中安装requireJS类型定义
typings install dt~node --save --global
若是将Webpack用做构建工具,则能够包括Webpack类型。
npm install --save-dev @ types / webpack-env
更新您的tsconfig.json
用在如下compilerOptions
:
"types": [ "webpack-env" ]
这使您能够执行require.ensure
和其余Webpack特定功能。
使用CLI,您能够按照上面的Webpack步骤进行操做,并将“类型”块添加到tsconfig.app.json
。
或者,您可使用预安装的node
类型。 请记住,这将包括客户端代码中实际上不可用的其余类型。
"compilerOptions": { // other options "types": [ "node" ] }