开发者问题收集

TypeScript 收到错误 TS2304:找不到名称“require”

2015-07-02
858608

我正在尝试启动并运行我的第一个 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.ts 文件的内容为:

/// <reference path="node/node.d.ts" />
/// <reference path="requirejs/require.d.ts" />

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

tsd install node --save
tsd install require --save

生成的 .js 文件似乎运行正常,因此我可以忽略该错误。但我很想知道为什么会出现此错误以及我做错了什么。

3个回答

快速而粗略

如果您只有一个文件使用 require,或者您出于演示目的执行此操作,则可以在 TypeScript 文件的顶部定义 require。

declare var require: any

TypeScript 2.x

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

npm install @types/node --save-dev

声明文件的未来 (6/15/2016)

Tools like Typings and tsd will continue to work, and we’ll be working alongside those communities to ensure a smooth transition.

验证或编辑您的 src /tsconfig.app.json 以使其包含以下内容:

...
"types": [ "node" ],
"typeRoots": [ "../node_modules/@types" ]
...

确保该文件位于 src 文件夹中,而不是根应用文件夹中。

默认情况下,@types 下的任何软件包都已包含在您的构建中, 除非 您指定了其中任何一个选项。 阅读更多

TypeScript 1.x

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

安装 typings

npm install typings -g --save-dev

从 DefinitelyType 的存储库安装 requireJS 类型定义

typings install dt~node --save --global

Webpack

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

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

使用以下内容更新您的 tsconfig.json compilerOptions

"types": [
      "webpack-env"
    ]

这允许您执行 require.ensure 和其他 Webpack 特定功能。

Angular CLI

使用 CLI,您可以按照上面的 Webpack 步骤并将“types”块添加到您的 tsconfig.app.json

或者,您可以使用预安装的 node 类型。请记住,这将在您的客户端代码中包含实际上不可用的其他类型。

"compilerOptions": {
    // other options
    "types": [
      "node"
    ]
  }
cgatian
2016-03-12

对于打字稿2.x ,现在有两个步骤:

  1. 安装定义 需要 的软件包。例如:

     npm install @types/node -save-dev 
  2. 告诉TypeScript将其包含在 tsconfig.json 中:

     {
     “ compileroptions”:{
     “类型”:[“ node”]
     }
    } 

第二步仅在您需要访问全球可用功能(例如 require )时很重要。对于大多数软件包,您应该只使用“软件包” 模式的 导入软件包。无需在上面的tsconfig.json类型中包含每个软件包。

Jordan
2016-09-08

你可以

declare var require: any

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

此外,除了 var mongoose = require('mongoose') ,你还可以尝试以下方法

import mongoose from 'mongoose' // or
import mongoose = require('mongoose')
P Varga
2015-07-07