打字稿出错TS2304:找不到名字'require'
我试图让我的第一个Typescript和DefinitelyTyped节点应用程序启动并运行,并遇到一些错误。
当我尝试传输一个简单的ts节点页时,出现错误“TS2304:找不到名称'require'”。 我已经读过了这个错误的其他几个事件,我不认为我有类似的问题。
我在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文件似乎工作正常,所以我可以忽略错误。 但我很感激知道为什么会发生这个错误,我做错了什么。
TypeScript 2.x
如果您使用的是TypeScript 2.x,则不再需要安装Typings或Definitely Typed。 只需安装以下软件包。
npm install @types/node --save-dev
声明文件的未来(6/15/2016)
像Typings和tsd等工具将继续工作,我们将与这些社区一起工作,以确保顺利过渡。
可选:如果您在typeroots
中指定了typeroots
或types
。 您可能需要更新tsconfig.json
以包含节点作为types。 默认情况下,任何在@types下的包都已经包含在你的构build中, 除非你已经指定了这些选项。 阅读更多
以下是每个选项的正确configuration。
{ "compilerOptions": { // types option has been previously configured "types": [ // add node as an option "node" ], // typeRoots option has been previously configured "typeRoots": [ // add path to @types "node_modules/@types" ] } }
TypeScript 1.x
使用types(DefinitelyTyped的replace),您可以直接从GitHub存储库指定定义。
安装types
npm install typings -g --save-dev
从DefinitelyType的回购安装requireJStypes定义
typings install dt~node --save --global
快速和肮脏
如果你只有一个使用require的文件,或者你正在做这个演示的目的,你可以在你的TypeScript文件的顶部定义require。
declare var require: any
Angular CLI
如果您尝试在Angular CLI项目中使用require
语句,请更新tsconfig.app.json
以包含节点types。
"compilerOptions": { // other options "types": [ "node" ] }
对于TypeScript 2.x ,现在有两个步骤:
-
安装一个定义
require
的包。 例如:npm install @types/node --save-dev
-
告诉TypeScript将其全局包含在
tsconfig.json
:{ "compilerOptions": { "types": ["node"] } }
如果您需要访问全球可用的function(例如, require
第二步就非常重要。 对于大多数包,你应该只使用import package from 'package'
模式的import package from 'package'
。 没有必要在上面的tsconfig.jsontypes数组中包含每个包。
您可以
declare var require: any
或者,为了更全面的支持,使用DefinitelyTyped的require.d.ts
此外,而不是var mongoose = require('mongoose')
,你可以尝试以下
import mongoose from 'mongoose' // or import mongoose = require('mongoose')
代替:
'use strict'; /// <reference path="typings/tsd.d.ts" />
尝试:
/// <reference path="typings/tsd.d.ts" /> 'use strict';
即首先参考path。
我发现解决scheme是使用TSD命令:
tsd install node --save
其中添加/更新typings/tsd.d.ts
文件,该文件包含节点应用程序所需的所有types定义。
在我的文件顶部,我提到了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[]; }
我拿Peter Varga的回答来添加declare var require: any;
并通过使用预处理装载器将它变成一个通用的解决scheme,通用于所有.ts文件:
-
安装预处理器加载器:
npm install preprocessor-loader
-
将加载器添加到您的webpack.config.js (我使用ts-loader处理TypeScript源代码):
module: { loaders: [{ test: /\.tsx?$/, loader: 'ts-loader!preprocessor?file&config=preprocess-ts.json' }] }
- 添加将解决方法添加到每个来源的configuration:
{ "line": false, "file": true, "callbacks": [{ "fileName": "all", "scope": "source", "callback": "(function shimRequire(source, fileName) { return 'declare var require: any;' + source; })" }] }
你可以用相同的方法添加更强健的require.d.ts ,但是declare var require: any;
在我的情况下是足够的。
请注意, 预处理器1.0.5中存在一个缺陷 ,它会切断最后一行,所以只要确保在最后有一个额外的行空间返回,就可以了。
有时从tsconfig.json丢失“茉莉花”可能会导致此错误。 (Typescript 2.X)
所以添加
"types": [ "node", "jasmine" ]
到你的tsconfig.json
我一直在努力解决这个问题。 我相信,这适用于所有发布候选人 aka rc但我没有testing是。 对于@angular rc.2来说,它运行良好。
- 在
package.json
添加core-js
作为npm依赖项 - 运行
typings install core-js --save
- 删除
package.json
中的所有"es6-shim"
事件。 你不再需要它了。
干杯!
-
你有没有指定使用什么模块来传输代码?
tsc --target es5 --module commonjs script.ts
您必须这样做才能让转译人员知道您正在编译NodeJS代码。 文档 -
您也必须安装mongoose定义
tsd install mongoose --save
-
不要使用
var
声明variables(除非必要,这是非常罕见的情况),请使用let
来代替。 了解更多
我无法通过使用上面的任何技巧来得到“要求”错误。
但我发现问题是,我的打字工具的视觉工作室,旧版本(1.8.6.0)和当今最新版本是(2.0.6.0)
您可以从以下位置下载最新版本的工具:
https://www.microsoft.com/en-us/download/details.aspx?id=48593
除了cgatian的回答,还有TypeScript 1.x
如果您仍然看到错误,请在您的编译器选项中专门提供index.d.ts。
"files": [ "typings/index.d.ts" ]
如果您可以编译代码,但Visual Studio 2015将错误文本中的“require”函数标记为错误, 则无法find名称'require'或无法parsing符号'require'将Visual Studio 2015的TypeScript更新为最新版本(目前为2.1.5)并更新ReSharper(如果使用的话)至less版本2016.3.2。
我有一段时间这个烦人的问题,找不到解决scheme,但最终解决这个问题。 希望这有助于某人。
在tsconfig.json
添加以下tsconfig.json
:
"typeRoots": [ "../node_modules/@types" ]