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,则不再需要安装Typings或Definitely Typed.只需安装以下包.
npm install @types/node --save-dev
Run Code Online (Sandbox Code Playgroud)
Typing和tsd等工具将继续发挥作用,我们将与这些社区合作,确保顺利过渡.
可选:
如果您指定tsconfig.json或compilerOptions在您的require.ensure.您可能需要将tsconfig.app.jsonto include节点更新为类型.默认情况下,除非您指定了其中任何一个选项,否则 @types下的任何包都已包含在您的构建中. 阅读更多
以下是每个选项的正确配置.
...
"types": [ "node" ],
"typeRoots": [ "../node_modules/@types" ]
...
Run Code Online (Sandbox Code Playgroud)
使用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类型.
npm install --save-dev @ types/webpack-env
node使用以下内容更新您tsconfig.json:
"types": [
"webpack-env"
]
Run Code Online (Sandbox Code Playgroud)
这允许您执行compilerOptions和其他Webpack特定的功能.
使用CLI,您可以按照上面的Webpack步骤添加"类型"块到您的require.ensure.
或者,您可以使用预安装的tsconfig.app.json类型.请记住,这将包括客户端代码中不可用的其他类型.
"compilerOptions": {
// other options
"types": [
"node"
]
}
Run Code Online (Sandbox Code Playgroud)
Jor*_*dan 95
对于TypeScript 2.x,现在有两个步骤:
安装定义的包require.例如:
npm install @types/node --save-dev
Run Code Online (Sandbox Code Playgroud)告诉TypeScript将其全局包含在tsconfig.json:
{
"compilerOptions": {
"types": ["node"]
}
}
Run Code Online (Sandbox Code Playgroud)第二步仅在您需要访问全局可用功能时才很重要require.对于大多数包,您应该只使用该import package from 'package'模式.不需要在上面的tsconfig.json类型数组中包含每个包.
ᆼᆺᆼ*_*ᆼᆺᆼ 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
代替:
'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)
即参考路径首先.
我发现解决方案是使用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)
仅供参考,我使用的是Angular 7.1.4,TypeScript 3.1.6,我唯一需要做的就是在此行中添加tsconfig.json:
"types": ["node"], // within compilerOptions
Run Code Online (Sandbox Code Playgroud)
我接受了Peter Varga的回答,declare var require: any;并使用preprocess-loader将其添加到一个通用解决方案中,该解决方案通常适用于所有.ts文件:
安装预处理程序加载器:
npm install preprocessor-loader
Run Code Online (Sandbox Code Playgroud)将加载程序添加到您的webpack.config.js中(我正在使用ts-loader处理TypeScript源代码):
npm install preprocessor-loader
Run Code Online (Sandbox Code Playgroud)
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中存在一个错误,该错误会截断最后一行,因此请确保在末尾有额外的行空间返回,并且您会没事的。
小智 5
对我来说,这是通过向角度编译器选项添加类型来解决的。
"angularCompilerOptions": {
"fullTemplateTypeCheck": true,
"strictInjectionParameters": true,
"types": [ "node" ]
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
389466 次 |
| 最近记录: |