打字稿得到错误TS2304:找不到名字'要求'

Jer*_*Kur 415 node.js typescript definitelytyped

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

当我尝试转换一个简单的ts节点页面时,我收到错误"TS2304:找不到名称'require'".我已经在SO上阅读了其他几个这样的错误,我认为我没有类似的问题.
我在shell提示符下运行命令:tsc movie.server.model.ts.该文件的内容是:

tsc movie.server.model.ts.
Run Code Online (Sandbox Code Playgroud)

var mongoose = require('mongoose')行引发错误

typings/tsd.d.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';
Run Code Online (Sandbox Code Playgroud)

.d.ts文件引用放在相应的文件夹中,并通过命令添加到typings/tsd.d.ts:

/// <reference path="node/node.d.ts" />
/// <reference path="requirejs/require.d.ts" />
Run Code Online (Sandbox Code Playgroud)

生成的.js文件似乎工作正常,所以我可以忽略错误.但我很想知道为什么会出现这种错误以及我做错了什么.

cga*_*ian 665

快速而肮脏

如果你只有一个文件使用require,或者你是为了演示目的而这样做,你可以在TypeScript文件的顶部定义require.

declare var require: any
Run Code Online (Sandbox Code Playgroud)

TypeScript 2.x

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

npm install @types/node --save-dev
Run Code Online (Sandbox Code Playgroud)

宣言文件的未来(2016年6月15日)

Typing和tsd等工具将继续发挥作用,我们将与这些社区合作,确保顺利过渡.

可选: 如果您指定tsconfig.jsoncompilerOptions在您的require.ensure.您可能需要将tsconfig.app.jsonto include节点更新为类型.默认情况下,除非您指定了其中任何一个选项,否则 @types下的任何包都已包含在您的构建中. 阅读更多

以下是每个选项的正确配置.

...
"types": [ "node" ],
"typeRoots": [ "../node_modules/@types" ]
...
Run Code Online (Sandbox Code Playgroud)

TypeScript 1.x

使用typings(DefinitelyTyped的替换),您可以直接从GitHub存储库指定定义.

安装打字

npm install typings -g --save-dev
Run Code Online (Sandbox Code Playgroud)

从DefinitelyType的repo安装requireJS类型定义

typings install dt~node --save --global
Run Code Online (Sandbox Code Playgroud)

的WebPack

如果您使用Webpack作为构建工具,则可以包含Webpack类型.

npm install --save-dev @ types/webpack-env

node使用以下内容更新您tsconfig.json:

"types": [
      "webpack-env"
    ]
Run Code Online (Sandbox Code Playgroud)

这允许您执行compilerOptions和其他Webpack特定的功能.

角度CLI

使用CLI,您可以按照上面的Webpack步骤添加"类型"块到您的require.ensure.

或者,您可以使用预安装的tsconfig.app.json类型.请记住,这将包括客户端代码中不可用的其他类型.

"compilerOptions": {
    // other options
    "types": [
      "node"
    ]
  }
Run Code Online (Sandbox Code Playgroud)

  • 我认为这是错误的,因为它与requireJS的类型相关,而不是内置于`require`的节点.对于ES5输出目标的某些变化可能是正确的答案,但不是一般情况. (7认同)
  • 为什么不只是"typings install --save --ambient require"? (4认同)
  • 请参考jordan awnser。就我而言,我安装了以下 @types,所以我添加了 -&gt; "types": ["node","es6-promise", "core-js", "jasmine"] &lt;- 到 tsconfig.json 中的 compilerOptions (2认同)

Jor*_*dan 95

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

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

    npm install @types/node --save-dev
    
    Run Code Online (Sandbox Code Playgroud)
  2. 告诉TypeScript将其全局包含在tsconfig.json:

    {
        "compilerOptions": {
            "types": ["node"]
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

第二步仅在您需要访问全局可用功能时才很重要require.对于大多数包,您应该只使用该import package from 'package'模式.不需要在上面的tsconfig.json类型数组中包含每个包.

  • 如果您的@types / ...文件夹多于@ types / node文件夹,请不要在tsconfig.json中添加`“ types”:[“ node”]`,因为TypeScript编译器将省略其他未提及的内容包。这将破坏您的IDE类型解析。它写在这里https://www.typescriptlang.org/docs/handbook/tsconfig-json.html#types-typeroots-and-types (3认同)

ᆼᆺᆼ*_*ᆼᆺᆼ 68

您可以

declare var require: any
Run Code Online (Sandbox Code Playgroud)

或者,要获得更全面的支持,请使用DefinitelyTyped的require.d.ts

另外,var mongoose = require('mongoose')您可以尝试以下方法

import mongoose from 'mongoose' // or
import mongoose = require('mongoose')
Run Code Online (Sandbox Code Playgroud)


小智 27

就我而言,这是一个超级愚蠢的问题,其中src/tsconfig.app.json覆盖了tsconfig.json设置。

所以,我有这个tsconfig.json

    "types": [
      "node"
    ]
Run Code Online (Sandbox Code Playgroud)

而这个在src/tsconfig.app.json

    "types": []
Run Code Online (Sandbox Code Playgroud)

我希望有人觉得这有帮助,因为这个错误导致我白发。


小智 11

这个答案涉及现代设置(typescript 2.x,webpack> 2.x)

你不需要安装@ types/node(这是所有的node.js类型,并且对于前端代码是无关紧要的,实际上使诸如setTimout等不同返回值之类的东西变得复杂.

你需要安装@ types/webpack-env

npm i -D @types/webpack-env

它给出了webpack所具有的运行时签名(包括require和require.ensure等).

还要确保你的tsconfig.json没有设置'types'数组 - >这将使它获取node_modules/@ types文件夹中的所有类型定义.如果要限制搜索类型,可以将typeRoot属性设置为node_modules/@ types

  • 这是重要的备注 **还要确保您的 tsconfig.json 没有设置 'types' 数组 -&gt; 这将使它在您的 node_modules/@types 文件夹中拾取所有类型定义** (3认同)

Hur*_*ane 9

代替:

'use strict';

/// <reference path="typings/tsd.d.ts" />
Run Code Online (Sandbox Code Playgroud)

尝试:

/// <reference path="typings/tsd.d.ts" />

'use strict';
Run Code Online (Sandbox Code Playgroud)

即参考路径首先.


Ale*_*ack 7

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

tsd install node --save
Run Code Online (Sandbox Code Playgroud)

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

在我的文件的顶部,我提到了tsd.d.ts这样的引用:

/// <reference path="../typings/tsd.d.ts" />
Run Code Online (Sandbox Code Playgroud)

截至2016年1月,需求定义如下:

declare var require: NodeRequire;

interface NodeModule {
    exports: any;
    require: NodeRequireFunction;
    id: string;
    filename: string;
    loaded: boolean;
    parent: any;
    children: any[];
}
Run Code Online (Sandbox Code Playgroud)


Hea*_*ren 6

仅供参考,我使用的是Angular 7.1.4TypeScript 3.1.6,我唯一需要做的就是在此行中添加tsconfig.json

    "types": ["node"], // within compilerOptions
Run Code Online (Sandbox Code Playgroud)


Ben*_*ema 5

我接受了Peter Varga的回答declare var require: any;并使用preprocess-loader将其添加到一个通用解决方案中,该解决方案通常适用于所有.ts文件:

  1. 安装预处理程序加载器:

    npm install preprocessor-loader
    
    Run Code Online (Sandbox Code Playgroud)
  2. 将加载程序添加到您的webpack.config.js中(我正在使用ts-loader处理TypeScript源代码):

npm install preprocessor-loader
Run Code Online (Sandbox Code Playgroud)
  1. 添加将变通办法添加到每个源的配置:
    module: {
        loaders: [{
            test: /\.tsx?$/,
            loader: 'ts-loader!preprocessor?file&config=preprocess-ts.json'
        }]
    }
Run Code Online (Sandbox Code Playgroud)

您可以用相同的方法添加更可靠的require.d.ts,但declare var require: any;在我的情况下就足够了。

请注意,预处理器1.0.5中存在一个错误,该错误会截断最后一行,因此请确保在末尾有额外的行空间返回,并且您会没事的。

  • 为什么这被否决了?它回答了这个问题,并带来了一些新的和重要的东西。现在您不必单独处理每个文件来满足转译器和 webpack。 (2认同)

小智 5

对我来说,这是通过向角度编译器选项添加类型来解决的。

"angularCompilerOptions": {
"fullTemplateTypeCheck": true,
"strictInjectionParameters": true,
"types": [ "node" ]
}
Run Code Online (Sandbox Code Playgroud)