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


当前回答

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

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

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

其他回答

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

由于批准的答案没有提到实际创建自己的类型文件的可能性,并将其导入,让我在下面添加它。

假设你使用npm作为包管理器,你可以:

npm i @types/node --save-dev

然后在你的tsconfig文件中:

tsconfig.json

"include": ["typings.d.ts"],

然后创建你的类型文件:

typings.d.ts

import 'node/globals'

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

这个答案涉及到现代设置(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。

我还有另一个答案,建立在之前所有描述npm install @types/node并在tsconfig中包含node的答案之上。json / compilerOptions / types。

在我的例子中,我有一个基本的tsConfig。json和Angular应用程序中一个单独的扩展json:

{
    "extends": "../../tsconfig.json",
    "compilerOptions": {
        "outDir": "../out-tsc/app",
        "types": []
 },

我的问题是这个tsconf .app.json中的空类型-它破坏了基本配置中的一个。

在我的例子中,这是一个非常愚蠢的问题,src/tsconfig。app。Json覆盖了tsconfig。json设置。

我在tsconfig.json中有这个:

    "types": [
      "node"
    ]

这个在src/tsconfig。app。json中:

    "types": []

我希望有人发现这有帮助,因为这个错误导致我的头发变白了。