我试图让我的第一个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')行上抛出错误。
typings/tsd.d. d的内容。Ts文件是:
/// <reference path="node/node.d.ts" />
/// <reference path="requirejs/require.d.ts" />
.d。Ts文件引用被放置在适当的文件夹中,并添加到typings/tsd.d。通过命令:
tsd install node --save
tsd install require --save
生成的.js文件似乎工作正常,所以我可以忽略这个错误。但我想知道为什么这个错误发生,我做错了什么。
我把Peter Varga的答案添加到declare var require: any;并通过使用预处理加载器使其成为适用于所有.ts文件的通用解决方案:
安装preprocessor-loader:
NPM安装预处理器加载器
将加载器添加到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,但是声明var require: any;在我的情况下已经足够了。
注意,在预处理器1.0.5中有一个错误,它切断了最后一行,所以只要确保在结尾返回一个额外的行空间就可以了。
又快又脏
如果你只有一个使用require的文件,或者你这样做是为了演示,你可以在TypeScript文件的顶部定义require。
declare var require: any
打印稿2.倍
如果你使用的是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文件夹中的文件,而不是根app文件夹中的文件。
默认情况下,@types下的任何包都已经包含在构建中,除非您指定了这些选项中的任何一个。阅读更多
打印稿1.倍
使用类型(DefinitelyTyped的替换),您可以直接从GitHub存储库指定定义。
readme typings
npm install typings -g --save-dev
从DefinitelyType的repo中安装requireJS类型定义
typings install dt~node --save --global
Webpack
如果你使用Webpack作为构建工具,你可以包含Webpack类型。
npm install --save-dev @types/webpack-env
更新您的tsconfig。在compilerOptions下使用以下命令:
"types": [
"webpack-env"
]
这允许您进行require操作。确保和其他Webpack特定的功能。
角CLI
使用CLI,你可以按照上面的Webpack步骤,将“types”块添加到tsconfig.app.json中。
或者,您也可以使用预安装的节点类型。请记住,这将包括客户端代码中实际上不可用的其他类型。
"compilerOptions": {
// other options
"types": [
"node"
]
}
这个答案涉及到现代设置(TypeScript 2。Webpack > 2.x)
你不需要安装@types/node(这是所有node .js类型,与前端代码无关,实际上会使setTimout不同的返回值等事情复杂化。
你需要安装@types/webpack-env
npm i -D @types/webpack-env
它给出了Webpack拥有的运行时签名(包括require, require。保证等)
还要确保您的tsconfig。Json文件没有设置“类型”数组->,这将使它在你的node_modules/@types文件夹中拾取所有类型定义。
如果想限制类型的搜索,可以将typeRoot属性设置为node_modules/@types。