我试图让我的第一个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文件似乎工作正常,所以我可以忽略这个错误。但我想知道为什么这个错误发生,我做错了什么。


当前回答

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

这个烦人的问题困扰了我一段时间,一直找不到解决方法,但我最终用这种方法解决了它。

其他回答

对我来说,它是通过向angular编译器选项中添加类型来解决的。

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

我把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中有一个错误,它切断了最后一行,所以只要确保在结尾返回一个额外的行空间就可以了。

我发现解决方案是使用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[];
}

您是否指定了要使用什么模块来编译代码? TSC——target es5——module commonjs script.ts 您必须这样做才能让编译器知道您正在编译NodeJS代码。文档。 您还必须安装猫鼬定义 TSD安装猫鼬—保存 不要使用var来声明变量(除非必要,这是非常罕见的情况),而是使用let。了解更多

使用上面的任何技巧都无法消除'require'错误。

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

你可以从以下网站下载最新版本的工具:

TypeScript for Visual Studio 2015