我正在尝试启动并运行我的第一个 TypeScript 和 DefinedTyped 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 文件似乎工作正常,所以我可以忽略该错误。但我会很感激知道为什么会发生这个错误以及我做错了什么。
when I attempt to transpile a simple ts node page
<你是如何编译的......哪个实用程序
import { mongoose } from 'mongoose'
怎么样?
又快又脏
如果您只有一个使用 require 的文件,或者您出于演示目的这样做,您可以在 TypeScript 文件的顶部定义 require。
declare var require: any
打字稿 2.x
如果您使用的是 TypeScript 2.x,则不再需要安装 Typings 或肯定类型。只需安装以下软件包。
npm install @types/node --save-dev
The Future of Declaration Files (6/15/2016)
Typings 和 tsd 等工具将继续工作,我们将与这些社区合作以确保顺利过渡。
验证或编辑您的 src/tsconfig.app.json 以使其包含以下内容:
...
"types": [ "node" ],
"typeRoots": [ "../node_modules/@types" ]
...
确保是 src 文件夹中的文件,而不是根应用程序文件夹中的文件。
默认情况下,@types 下的任何包都已包含在您的构建中除非您指定了这些选项中的任何一个。 Read more
打字稿 1.x
使用类型(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
在 compilerOptions
下使用以下内容更新您的 tsconfig.json
:
"types": [
"webpack-env"
]
这允许您执行 require.ensure
和其他 Webpack 特定功能。
角 CLI
使用 CLI,您可以按照上面的 Webpack 步骤并将“类型”块添加到您的 tsconfig.app.json
。
或者,您可以使用预安装的 node
类型。请记住,这将包括您的客户端代码中实际上不可用的其他类型。
"compilerOptions": {
// other options
"types": [
"node"
]
}
对于 TypeScript 2.x,现在有两个步骤:
安装一个定义 require 的包。例如: npm install @types/node --save-dev 告诉 TypeScript 在 tsconfig.json 中全局包含它: { "compilerOptions": { "types": ["node"] } }
只有当您需要访问全局可用的函数(例如 require
)时,第二步才重要。对于大多数包,您应该只使用 import package from 'package'
模式。无需将每个包都包含在上面的 tsconfig.json 类型数组中。
"types": ["jasmine", "hammerjs"]
添加到 tsconfig.js
后,我也必须添加 node
。谢谢乔丹。
import express from "express";
现在告诉我需要尝试安装 @types/express 或为其添加 .d.ts 文件。
@types/...
而不仅仅是 @types/node
文件夹,请不要在 tsconfig.json
中添加 "types": ["node"]
,因为 TypeScript 编译器将忽略其他未提及的包。这将破坏您的 IDE 类型解析。写在这里typescriptlang.org/docs/handbook/…
你可以
declare var require: any
或者,要获得更全面的支持,请使用 DefinitelyTyped's require.d.ts
此外,您可以尝试以下方法,而不是 var mongoose = require('mongoose')
import mongoose from 'mongoose' // or
import mongoose = require('mongoose')
use strict
:basarat answer 和 “Use Strict” needed in a TypeScript file?。在 TypeScript 中必须使用 use strict
。
"use strict"
可能会有所帮助,我将编辑我的答案
就我而言,这是一个超级愚蠢的问题,其中 src/tsconfig.app.json
覆盖了 tsconfig.json
设置。
所以,我在 tsconfig.json
中有这个:
"types": [
"node"
]
src/tsconfig.app.json
中的这个:
"types": []
我希望有人觉得这很有帮助,因为这个错误导致我白发苍苍。
这个答案与现代设置有关(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" />
尝试:
/// <reference path="typings/tsd.d.ts" />
'use strict';
即首先参考路径。
仅供参考,我使用的是 Angular 7.1.4、TypeScript 3.1.6,我唯一需要做的就是在 tsconfig.json
中添加这一行:
"types": ["node"], // within compilerOptions
npm i @types/node
,然后将 node
添加到 tsconfig 中的类型字段。 - 是否安装了 npm。
我发现解决方案是使用 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[];
}
我将 Peter Varga's answer 添加到 declare var require: any;
并通过使用 preprocess-loader 使其成为适用于所有 .ts 文件的通用解决方案:
安装预处理器加载器: npm install preprocessor-loader 将加载器添加到您的 webpack.config.js (我使用 ts-loader 来处理 TypeScript 源):
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 会截断最后一行,所以只要确保最后有一个额外的行空间返回就可以了。
我还有另一个答案,它建立在所有先前描述 npm install @types/node
并在 tsconfig.json / compilerOptions / types
中包括 node
的答案之上。
就我而言,我在 Angular 应用程序中有一个基础 tsConfig.json
和一个单独的 tsConfig.json
,它扩展了这个:
{
"extends": "../../tsconfig.json",
"compilerOptions": {
"outDir": "../out-tsc/app",
"types": []
},
我的问题是这个 tsconfi.app.json
中的空 types
- 它破坏了基本配置中的那个。
对我来说,它是通过向角度编译器选项添加类型来解决的。
"angularCompilerOptions": {
"fullTemplateTypeCheck": true,
"strictInjectionParameters": true,
"types": [ "node" ]
}
import * as mongoose from 'mongoose'
由于批准的答案没有提到实际创建自己的打字文件并将其导入那里的可能性,让我在下面添加它。
假设您使用 npm 作为包管理器,您可以:
npm i @types/node --save-dev
然后在您的 tsconfig 文件中:
tsconfig.json
"include": ["typings.d.ts"],
然后创建您的类型文件:
打字.d.ts
import 'node/globals'
完成,错误消失,享受 TypeScript :)
我也一直在努力解决这个问题。我相信这适用于所有候选版本,也就是 rc,但我没有测试。对于@angular rc.2,它运行良好。
在 package.json 中添加 core-js 作为 npm 依赖项 run typings install core-js --save 删除 package.json 中的所有“es6-shim”。你不再需要它了。
干杯!
有时 tsconfig.json 中缺少“jasmine”可能会导致此错误。 (打字稿 2.X)
所以添加
"types": [
"node",
"jasmine"
]
到您的 tsconfig.json
文件。
Electron + Angular 2/4 加法:
除了将“节点”类型添加到 ts.config 各种文件之外,最终对我有用的是在 typings.d.ts
文件中添加下一个:
declare var window: Window;
interface Window {
process: any;
require: any;
}
请注意,我的案例是使用 Electron + Angular 2/4 开发的。我需要全局窗口上的要求。
您是否指定了用于转换代码的模块? tsc --target es5 --module commonjs script.ts 您必须这样做才能让转译器知道您正在编译 NodeJS 代码。文档。您还必须安装 mongoose 定义 tsd install mongoose --save 不要使用 var 来声明变量(除非必要,这是一种非常罕见的情况),请改用 let。了解更多
除了 cgatian 的回答之外,对于 TypeScript 1.x
如果您仍然看到错误,请在您的编译器选项中专门提供 index.d.ts。
"files": [
"typings/index.d.ts"
]
确保您已安装 npm i @types/node
通过使用上述任何技巧,我都无法消除“要求”错误。
但我发现问题在于我的 Visual Studio 的 TypeScript 工具的旧版本(1.8.6.0)和今天的最新版本是(2.0.6.0)。
您可以从以下位置下载最新版本的工具:
TypeScript for Visual Studio 2015
如果您可以编译代码,但 Visual Studio 2015 将“require”函数标记为错误,错误文本无法找到名称“require”或无法解析符号“require”,请将 Visual Studio 2015 的 TypeScript 更新到最新版本(目前为 2.1. 5) 并将 ReSharper(如果您使用它)更新到至少版本 2016.3.2。
我有一段时间遇到这个烦人的问题并且找不到解决方案,但我最终以这种方式解决了它。
在 tsconfig.json
中添加以下内容:
"typeRoots": [ "../node_modules/@types" ]
如果您使用 Yarn v3 并在 VSCode 中看到此错误(找不到名称要求)或其他与节点相关的“找不到”错误,请确保您安装了 Yarn 的 VSCode sdk 插件并选择了 Typescript 的工作区版本。
安装 SDK 的命令:
yarn dlx @yarnpkg/sdks
要设置 Typescript 版本:
选择一个 Typescript 文件 按 Command + Shift + P 键入 Typescript:选择 Typescript 版本
选择“使用工作区版本”
有关详细信息,请参阅 https://yarnpkg.com/getting-started/editor-sdks#vscode。
如果您在 .ts 文件中遇到此问题,该文件只是为您提供一些常量值,那么您可以
将您的 .ts 文件重命名为 .js 文件
并且错误不会再次出现。
Unable to find "require" ("npm") in the registry
错误。是否需要更大的 nodeJS 类型集的一部分?require
。对于 ES5 输出目标的某些变体,它可能是正确的答案,但不是一般情况。@types/node
是 TypeScript 定义。 Node 不包括这些,也不应该包括它们。