我试图让我的第一个Typescript和DefinitelyTyped节点应用程序启动并运行,并遇到一些错误 .
当我尝试转换一个简单的ts节点页面时,我收到错误"TS2304: Cannot find name 'require' " . 我已经在SO上阅读了其他几个这样的错误,我认为我没有类似的问题 .
我在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文件似乎工作正常,所以我可以忽略错误 . 但我很想知道为什么会出现这种错误以及我做错了什么 .
17 回答
如果您可以编译代码,但Visual Studio 2015将'require'函数标记为错误,错误文本无法找到名称'require'或无法解析符号'require'将Visual Studio 2015的TypeScript更新到最新版本(目前为2.1.5)并更新ReSharper(如果您使用它)至少版本2016.3.2 .
我有这个恼人的问题一段时间,找不到解决方案,但最终以这种方式解决了 . 希望这对某人有帮助 .
如果你在ts文件中遇到这个问题,那里只为你提供一些常量值,那么你可以
并且错误不会再来了 .
快速而肮脏
如果你只有一个文件使用require,或者你是为了演示目的而这样做,你可以在TypeScript文件的顶部定义require .
TypeScript 2.x.
如果您使用的是TypeScript 2.x,则不再需要安装Typings或Definitely Typed . 只需安装以下包 .
The Future of Declaration Files (6/15/2016)
OPTIONAL: 如果您在
tsconfig.json
中指定typeroots
或types
. 您可能需要将tsconfig.json
更新为包含节点作为类型 . 默认情况下,@types下的任何包都已包含在您的构建 unless 中,您已指定其中任何一个选项 . Read more以下是每个选项的正确配置 .
TypeScript 1.x
使用typings(DefinitelyTyped的替换),您可以直接从GitHub存储库指定定义 .
安装打字
从DefinitelyType的repo安装requireJS类型定义
Webpack
如果您使用Webpack作为构建工具,则可以包含Webpack类型 .
npm install --save-dev @ types / webpack-env
在
compilerOptions
下使用以下内容更新tsconfig.json
:这允许您执行
require.ensure
和其他Webpack特定功能 .Angular CLI
使用CLI,您可以按照上面的Webpack步骤将"types"块添加到
tsconfig.app.json
.或者,您可以使用预安装的
node
类型 . 请记住,这将包括客户端代码中不可用的其他类型 .确保已安装
npm i @types/node
我发现解决方案是使用TSD命令:
其中添加/更新了
typings/tsd.d.ts
文件,该文件包含节点应用程序所需的所有类型定义 .在我的文件的顶部,我像这样引用了
tsd.d.ts
:截至2016年1月,需求定义如下:
除了cgatian的答案之外, TypeScript 1.x
如果您仍然看到错误,请在您的编译器选项中专门提供index.d.ts .
代替:
尝试:
即首先参考路径 .
我使用Peter Varga's answer添加
declare var require: any;
并使其成为通用解决方案,通常使用preprocess-loader适用于所有.ts文件:您可以以相同的方式添加更强大的require.d.ts,但
declare var require: any;
在我的情况下已经足够了 .注意,there's a bug in preprocessor 1.0.5,它会切断最后一行,所以只需要确保最后有一个额外的行空间返回,你就可以了 .
我也一直在努力解决这个问题 . 我相信这适用于所有发布候选人,即rc,但我没有测试 . 对于 @angular rc.2 ,效果很好 .
在
package.json
中添加core-js
作为npm依赖项运行
typings install core-js --save
删除
package.json
中的所有"es6-shim"
个出现 . 你不再需要它了 .干杯!
这个答案涉及现代设置(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
For TypeScript 2.x ,现在有两个步骤:
require
的包 . 例如:第二步仅在您需要访问全局可用功能(例如
require
)时才重要 . 对于大多数软件包,您应该只使用import package from 'package'
模式 . 不需要在上面的tsconfig.json类型数组中包含每个包 .您可以
或者,要获得更全面的支持,请使用DefinitelyTyped's require.d.ts
另外,您可以尝试以下操作,而不是
var mongoose = require('mongoose')
我无法通过使用上述任何技巧来消除'require'错误 .
但我发现问题在于我的visual studio工具用于Visual Studio,旧版本(1.8.6.0)和今天的最新版本是(2.0.6.0)
您可以从以下位置下载最新版本的工具:
https://www.microsoft.com/en-us/download/details.aspx?id=48593
有时从tsconfig.json中丢失"jasmine"可能会导致此错误 . (Typescript 2.X)
所以加
你的tsconfig.json
电子角2/4添加:除了将'node'类型添加到ts.config各种文件之外,最终对我有用的是添加typings.d.ts文件的下一个:
请注意,我的情况是用电子角2/4发展 . 我需要窗口全局的需求 .
您是否指定了用于转换代码的模块?
tsc --target es5 --module commonjs script.ts
您必须这样做才能让转换器知道您正在编译NodeJS代码 . Docs .
您还必须安装mongoose定义
tsd install mongoose --save
不要使用
var
来声明变量(除非必要,这是一种非常罕见的情况),请改用let
. Learn more about that在
tsconfig.json
中添加以下内容: