ChatGPT解决这个技术问题 Extra ChatGPT

TypeScript 出现错误 TS2304:找不到名称“需要”

我正在尝试启动并运行我的第一个 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 <你是如何编译的......哪个实用程序
我只是通过键入命令在命令行上运行:tsc movie.server.model.ts。 FWIW 这是在 Mac 上。
同样的问题也发生在我使用 Visual Studio Code 的 IDE 中。我会在我的另一个 IDE IntelliJ 中尝试一下。我认为下降到命令行是测试这个问题的最干净的方法。
import { mongoose } from 'mongoose' 怎么样?

B
BuZZ-dEE

又快又脏

如果您只有一个使用 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"
    ]
  }

为什么不只是“打字安装--保存--环境要求”?
我收到此 Unable to find "require" ("npm") in the registry 错误。是否需要更大的 nodeJS 类型集的一部分?
我认为这是错误的,因为它与 requireJS 的类型有关,而不是节点内置于 require。对于 ES5 输出目标的某些变体,它可能是正确的答案,但不是一般情况。
请参考jordan awnser。在我的情况下,我安装了以下@types,所以我添加了 -> "types": ["node","es6-promise", "core-js", "jasmine"] <- to compilerOptions in tsconfig.json
@Seagull @types/node 是 TypeScript 定义。 Node 不包括这些,也不应该包括它们。
J
Jordan

对于 TypeScript 2.x,现在有两个步骤:

安装一个定义 require 的包。例如: npm install @types/node --save-dev 告诉 TypeScript 在 tsconfig.json 中全局包含它: { "compilerOptions": { "types": ["node"] } }

只有当您需要访问全局可用的函数(例如 require)时,第二步才重要。对于大多数包,您应该只使用 import package from 'package' 模式。无需将每个包都包含在上面的 tsconfig.json 类型数组中。


您可以将 lib 用于某些 es5 github.com/Microsoft/TypeScript/wiki/… Eq: "lib": [ "dom", "es5", "es2015.promise", "es2015.collection" ]
"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')

只需在 TypeScript 中使用 use strictbasarat answer“Use Strict” needed in a TypeScript file?。在 TypeScript 中必须使用 use strict
嗯,根据那个答案,没有必要,但使用 "use strict" 可能会有所帮助,我将编辑我的答案
使用 declare var require 并不能解决真正的问题;只是隐藏它。
@Ant 是的,请记住这是从 2015 年开始的,而且,我认为没有“问题”可以解决。 TypeScript 2.0 现在当然优雅地解决了这个问题
h
h22a

就我而言,这是一个超级愚蠢的问题,其中 src/tsconfig.app.json 覆盖了 tsconfig.json 设置。

所以,我在 tsconfig.json 中有这个:

    "types": [
      "node"
    ]

src/tsconfig.app.json 中的这个:

    "types": []

我希望有人觉得这很有帮助,因为这个错误导致我白发苍苍。


这是我面临的问题。谢谢
我们有同样的问题。此注释有助于将“节点”包含在正确的文件中;在我们的例子中,我们需要调整 tsconfig.lib.json 文件,因为它是主项目的子模块。
P
Peter Mortensen

这个答案与现代设置有关(TypeScript 2.x,Webpack > 2.x)

您不需要安装 @types/node (这是所有 Node.js 类型并且与前端代码无关,实际上使诸如 setTimout 不同的返回值等事情复杂化。

您确实需要安装 @types/webpack-env

npm i -D @types/webpack-env

它给出了 Webpack 具有的运行时签名(包括 requirerequire.ensure 等)

还要确保您的 tsconfig.json 文件没有设置 'types' 数组 -> 这将使它拾取 node_modules/@types 文件夹中的所有类型定义。

如果要限制类型的搜索,可以将 typeRoot 属性设置为 node_modules/@types。


这很重要,还要确保您的 tsconfig.json 没有设置“类型”数组 -> 这将使其拾取 node_modules/@types 文件夹中的所有类型定义
webpack 方法还需要其他步骤吗?我得到一个编译错误`错误TS2580:找不到名称'require'。`
B
Brendan Green

代替:

'use strict';

/// <reference path="typings/tsd.d.ts" />

尝试:

/// <reference path="typings/tsd.d.ts" />

'use strict';

即首先参考路径。


有效,但有点脏 IMO - 它基本上隐藏了错误而不是纠正它。非常适合演示和快速脚本,但不适用于生产
P
Peter Mortensen

仅供参考,我使用的是 Angular 7.1.4TypeScript 3.1.6,我唯一需要做的就是在 tsconfig.json 中添加这一行:

    "types": ["node"], // within compilerOptions

做过某事。仍然出现此错误:找不到名称'require'。您需要为节点安装类型定义吗?尝试 npm i @types/node,然后将 node 添加到 tsconfig 中的类型字段。 - 是否安装了 npm。
r
rmlarsen

我发现解决方案是使用 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[];
}

我找不到 404
C
Community

我将 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 会截断最后一行,所以只要确保最后有一个额外的行空间返回就可以了。


为什么这被否决了?它回答了这个问题,并带来了一些新的和重要的东西。现在您不必单独修改每个文件以满足转译器和 webpack 的要求。
你能再解释一下第3步吗?我是新手,不知道在哪里放置此配置代码。
@user441058,检查 GitHub page,第 3 步是关于预处理加载程序的主要配置。
P
Peter Mortensen

我还有另一个答案,它建立在所有先前描述 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 - 它破坏了基本配置中的那个。


F
Farida Anjum

对我来说,它是通过向角度编译器选项添加类型来解决的。

"angularCompilerOptions": {
"fullTemplateTypeCheck": true,
"strictInjectionParameters": true,
"types": [ "node" ]
}

任何想知道的人都可以在 tsconfig.json 中找到它。
这是角度 9。
B
BuZZ-dEE
import * as mongoose from 'mongoose'

M
Matt

由于批准的答案没有提到实际创建自己的打字文件并将其导入那里的可能性,让我在下面添加它。

假设您使用 npm 作为包管理器,您可以:

npm i @types/node --save-dev

然后在您的 tsconfig 文件中:

tsconfig.json

"include": ["typings.d.ts"],

然后创建您的类型文件:

打字.d.ts

import 'node/globals'

完成,错误消失,享受 TypeScript :)


k
kucherenkovova

我也一直在努力解决这个问题。我相信这适用于所有候选版本,也就是 rc,但我没有测试。对于@angular rc.2,它运行良好。

在 package.json 中添加 core-js 作为 npm 依赖项 run typings install core-js --save 删除 package.json 中的所有“es6-shim”。你不再需要它了。

干杯!


core-js 类型是做什么用的?特定于节点?
P
Peter Mortensen

有时 tsconfig.json 中缺少“jasmine”可能会导致此错误。 (打字稿 2.X)

所以添加

"types": [
  "node",
  "jasmine"
]

到您的 tsconfig.json 文件。


P
Peter Mortensen

Electron + Angular 2/4 加法:

除了将“节点”类型添加到 ts.config 各种文件之外,最终对我有用的是在 typings.d.ts 文件中添加下一个:

declare var window: Window;
interface Window {
  process: any;
  require: any;
}

请注意,我的案例是使用 Electron + Angular 2/4 开发的。我需要全局窗口上的要求。


A
Ayman Nedjmeddine

您是否指定了用于转换代码的模块? tsc --target es5 --module commonjs script.ts 您必须这样做才能让转译器知道您正在编译 NodeJS 代码。文档。您还必须安装 mongoose 定义 tsd install mongoose --save 不要使用 var 来声明变量(除非必要,这是一种非常罕见的情况),请改用 let。了解更多


V
Vidish Datta

除了 cgatian 的回答之外,对于 TypeScript 1.x

如果您仍然看到错误,请在您的编译器选项中专门提供 index.d.ts。

"files": [
    "typings/index.d.ts"
]

R
Rupesh Kumar Tiwari

确保您已安装 npm i @types/node


P
Peter Mortensen

通过使用上述任何技巧,我都无法消除“要求”错误。

但我发现问题在于我的 Visual Studio 的 TypeScript 工具的旧版本(1.8.6.0)和今天的最新版本是(2.0.6.0)。

您可以从以下位置下载最新版本的工具:

TypeScript for Visual Studio 2015


P
Peter Mortensen

如果您可以编译代码,但 Visual Studio 2015 将“require”函数标记为错误,错误文本无法找到名称“require”或无法解析符号“require”,请将 Visual Studio 2015 的 TypeScript 更新到最新版本(目前为 2.1. 5) 并将 ReSharper(如果您使用它)更新到至少版本 2016.3.2。

我有一段时间遇到这个烦人的问题并且找不到解决方案,但我最终以这种方式解决了它。


P
Peter Mortensen

tsconfig.json 中添加以下内容:

"typeRoots": [ "../node_modules/@types" ]

@cgatian 的 answer 中已经提到了这一点。
@cgatian 提到了“node_modules/@types”,而我提到了“../node_modules/@types”。
J
Joshua Dyck

如果您使用 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


P
Peter Mortensen

如果您在 .ts 文件中遇到此问题,该文件只是为您提供一些常量值,那么您可以

将您的 .ts 文件重命名为 .js 文件

并且错误不会再次出现。


关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅