我试图让我的第一个Typescript和DefinitelyTyped节点应用程序启动并运行,并遇到一些错误。
当我尝试转换一个简单的ts节点页面时,我收到错误“TS2304:找不到名称'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文件似乎工作正常,所以我可以忽略错误。但我很想知道为什么会出现这种错误以及我做错了什么。
如果你只有一个文件使用require,或者你是为了演示目的而这样做,你可以在TypeScript文件的顶部定义require。
declare var require: any
如果您使用的是TypeScript 2.x,则不再需要安装Typings或Definitely Typed。只需安装以下包。
npm install @types/node --save-dev
The Future of Declaration Files (6/15/2016)
Typing和tsd等工具将继续发挥作用,我们将与这些社区合作,确保顺利过渡。
可选:如果你在typeroots
中指定types
或tsconfig.json
。您可能需要更新tsconfig.json
以将节点包含为类型。默认情况下,除非您指定了其中任何一个选项,否则@types下的任何包都已包含在您的构建中。 Read more
以下是每个选项的正确配置。
{
"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"
]
}
}
使用typings(DefinitelyTyped的替换),您可以直接从GitHub存储库指定定义。
安装打字
npm install typings -g --save-dev
从DefinitelyType的repo安装requireJS类型定义
typings install dt~node --save --global
如果您使用Webpack作为构建工具,则可以包含Webpack类型。
npm install --save-dev @ types / webpack-env
在tsconfig.json
下使用以下内容更新您的compilerOptions
:
"types": [
"webpack-env"
]
这允许您执行require.ensure
和其他Webpack特定功能。
使用CLI,您可以按照上面的Webpack步骤将“types”块添加到tsconfig.app.json
。
或者,您可以使用预先安装的node
类型。请记住,这将包括客户端代码中不可用的其他类型。
"compilerOptions": {
// other options
"types": [
"node"
]
}
有时从tsconfig.json中丢失“jasmine”可能会导致此错误。 (打字稿2.X)
所以加
"es6-shim"
到你的tsconfig.json
电子+角度2/4添加:除了将'node'类型添加到ts.config各种文件之外,最终对我有用的是添加typings.d.ts文件的下一个:
package.json
请注意,我的情况是用电子+角2/4开发。我需要窗口全局的要求。
确保你已经安装了"types": [
"node",
"jasmine"
]
从'mongoose'导入*作为猫鼬
declare var window: Window;
interface Window {
process: any;
require: any;
}
您必须这样做才能让转换器知道您正在编译NodeJS代码。 npm i @types/node
。tsc --target es5 --module commonjs script.ts
tsd install mongoose --save
。 var
我无法通过使用上述任何技巧来消除'require'错误。
但我发现问题在于我的visual studio工具适用于Visual Studio,旧版本(1.8.6.0)和今天的最新版本是(2.0.6.0)
您可以从以下位置下载最新版本的工具:
let
如果您可以编译代码,但Visual Studio 2015标记'require'函数,因为错误文本的错误找不到名称'require'或无法解析符号'require'将Visual Studio 2015的TypeScript更新到最新版本(目前2.1.5)并将ReSharper(如果使用它)更新到至少版本2016.3.2。
我有一段时间这个恼人的问题,找不到解决方案,但最终以这种方式解决了。希望这对某人有帮助。
在https://www.microsoft.com/en-us/download/details.aspx?id=48593中添加以下内容:
"files": [
"typings/index.d.ts"
]
我还有另一个答案建立在所有以前描述tsconfig.json
并包括"typeRoots": [ "../node_modules/@types" ]
中的npm install @types/node
的答案之上。
在我的情况下,我有一个基础node
和Angular应用程序中的一个单独的扩展这一个:
tsconfig.json / compilerOptions / types
我的问题是这个tsConfig.json
中的空{
"extends": "../../tsconfig.json",
"compilerOptions": {
"outDir": "../out-tsc/app",
"types": []
},
- 它破坏了基本配置中的那个。
对于TypeScript 2.x,现在有两个步骤:
require
的包。例如:
npm install @types/node --save-dev
tsconfig.json
中:
{
"compilerOptions": {
"types": ["node"]
}
}
第二步仅在您需要访问全局可用功能(如require
)时才重要。对于大多数包,您应该只使用import package from 'package'
模式。不需要在上面的tsconfig.json类型数组中包含每个包。
如果您在ts文件中遇到此问题,只有那里提供一些常量值,那么您可以
将.ts文件重命名为.js文件
并且错误不会再来了。
您可以
declare var require: any
或者,如需更全面的支持,请使用DefinitelyTyped's 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';
即首先参考路径。
这个答案涉及现代设置(typescript 2.x,webpack> 2.x)
你不需要安装@ types / node(这是所有的node.js类型,与前端代码无关,实际上使setTimeout等不同的返回值等复杂化。
你需要安装@ types / webpack-env
npm i -D @types/webpack-env
它给出了webpack所具有的运行时签名(包括require和require.ensure等)。
还要确保你的tsconfig.json没有设置'types'数组 - >这将使它获取node_modules / @ types文件夹中的所有类型定义。如果要限制搜索类型,可以将typeRoot属性设置为node_modules / @ types
我发现解决方案是使用TSD命令:
tsd install node --save
其中添加/更新了typings/tsd.d.ts
文件,该文件包含节点应用程序所需的所有类型定义。
在我的文件的顶部,我像这样引用了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[];
}
仅供参考,我使用的是Angular 7.1.4,typescript 3.1.6,我唯一需要做的就是在tsconfig.json
中添加这一行
"types": ["node"], // within compilerOptions
希望它可以提供帮助。
我使用Peter Varga's answer添加declare var require: any;
并使其成为通用解决方案,通常使用preprocess-loader适用于所有.ts文件:
npm install preprocessor-loader
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,但declare var require: any;
在我的情况下已经足够了。
注意,there's a bug in preprocessor 1.0.5,它切断了最后一行,所以只要确保你在最后有一个额外的行空间返回,你会没事的。
我也一直在努力解决这个问题。我相信这适用于所有发布候选人,即rc,但我没有测试。对于@angular rc.2,效果很好。
core-js
中将package.json
添加为npm依赖项typings install core-js --save
干杯!