【问题标题】:TypeScript getting error TS2304: cannot find name ' require'TypeScript 出现错误 TS2304:找不到名称“需要”
【发布时间】:2015-09-19 08:14:32
【问题描述】:

我正在尝试启动并运行我的第一个 TypeScript 和 DefinedlyTyped Node.js 应用程序,但遇到了一些错误。

当我尝试转译简单的 TypeScript Node.js 页面时,我收到错误“TS2304:找不到名称 'require'”。我已经阅读了 StackOverflow 上出现的其他几次此错误,但我认为我没有类似的问题。 我在 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' 怎么样?

标签: node.js typescript definitelytyped


【解决方案1】:

你可以

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 现在当然优雅地解决了这个问题
【解决方案2】:

代替:

'use strict';

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

试试:

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

'use strict';

即参考路径优先。

【讨论】:

  • 有效,但有点脏 IMO - 它基本上隐藏了错误而不是纠正它。非常适合演示和快速脚本,但不适用于生产
【解决方案3】:

我发现解决方案是使用 TSD 命令:

tsd install node --save

添加/更新typings/tsd.d.ts 文件,该文件包含节点应用程序所需的所有类型定义。

在我的文件顶部,我这样引用tsd.d.ts

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

截至 2016 年 1 月,require 的定义如下:

declare var require: NodeRequire;

interface NodeModule {
    exports: any;
    require: NodeRequireFunction;
    id: string;
    filename: string;
    loaded: boolean;
    parent: any;
    children: any[];
}

【讨论】:

  • 我找不到 404
【解决方案4】:

我将Peter Varga's answer 添加到declare var require: any; 并通过使用preprocess-loader 使其成为适用于所有.ts 文件的通用解决方案:

  1. 安装预处理器加载器:

    npm install preprocessor-loader
    
  2. 将加载器添加到您的 webpack.config.js(我使用 ts-loader 处理 TypeScript 源):

    module: {
        loaders: [{
            test: /\.tsx?$/,
            loader: 'ts-loader!preprocessor?file&config=preprocess-ts.json'
        }]
    }
  1. 添加将解决方法添加到每个源的配置:
{
    "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步是关于预处理加载器的主要配置。
【解决方案5】:

又快又脏

如果您只有一个使用 require 的文件,或者您出于演示目的这样做,您可以在 TypeScript 文件的顶部定义 require。

declare var require: any

TypeScript 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

TypeScript 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 特定功能。

Angular CLI

使用 CLI,您可以按照上面的 Webpack 步骤,将“类型”块添加到您的 tsconfig.app.json

或者,您可以使用预安装的 node 类型。请记住,这将在您的客户端代码中包含实际不可用的其他类型。

"compilerOptions": {
    // other options
    "types": [
      "node"
    ]
  }

【讨论】:

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

我也一直在努力解决这个问题。我相信这适用于所有 release Candidate aka rc 但我没有测试。 @angular rc.2 效果很好。

  1. package.json 中添加core-js 作为npm 依赖项
  2. 运行typings install core-js --save
  3. 删除package.json 中出现的所有"es6-shim"。你不再需要它了。

干杯!

【讨论】:

  • core-js 的分型有什么用?特定于节点?
【解决方案7】:
  1. 您是否指定了用于转译代码的模块?
    tsc --target es5 --module commonjs script.ts
    您必须这样做才能让转译器知道您正在编译 NodeJS 代码。 Docs.

  2. 您还必须安装猫鼬定义
    tsd install mongoose --save

  3. 不要使用var 来声明变量(除非必要,这是一种非常罕见的情况),而是使用letLearn more about that

【讨论】:

    【解决方案8】:

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

    1. 安装定义require 的包。例如:

      npm install @types/node --save-dev
      
    2. 告诉 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/…
    • 该解决方案适用于我的离子项目,没有问题,谢谢 :)
    【解决方案9】:

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

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

    您可以从以下网址下载最新版本的工具:

    TypeScript for Visual Studio 2015

    【讨论】:

      【解决方案10】:

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

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

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

      【讨论】:

        【解决方案11】:

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

        遇到这个烦人的问题有一阵子没找到解决办法,最后还是这样解决的。

        【讨论】:

          【解决方案12】:

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

          所以添加

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

          到您的tsconfig.json 文件。

          【讨论】:

            【解决方案13】:

            tsconfig.json中添加以下内容:

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

            【讨论】:

            • 这在@cgatian的answer中已经提到了。
            • @cgatian 提到了“node_modules/@types”,而我提到了“../node_modules/@types”。
            【解决方案14】:

            Electron + Angular 2/4 加法:

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

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

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

            【讨论】:

              【解决方案15】:

              这个答案与现代设置有关(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 没有设置 'types' 数组 -> 这将使它拾取 node_modules/@types 文件夹中的所有类型定义
              • 使用 webpack 方法是否还需要其他步骤?我收到一个编译错误`error TS2580: Cannot find name 'require'。`
              【解决方案16】:

              确保你已经安装了npm i @types/node

              【讨论】:

                【解决方案17】:

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

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

                并且错误不会再次出现。

                【讨论】:

                  【解决方案18】:

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

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

                  【讨论】:

                  • 做到了。仍然出现此错误:找不到名称'require'。您需要为节点安装类型定义吗?尝试 npm i @types/node 然后将 node 添加到 tsconfig 中的 types 字段。 - 是否安装了 npm。
                  【解决方案19】:

                  我还有另一个答案,它建立在之前所有描述 npm install @types/node 的答案之上,包括 tsconfig.json / compilerOptions / types 中的 node

                  在我的例子中,我有一个基础 tsConfig.json 和一个在 Angular 应用程序中扩展这个的单独的:

                  {
                      "extends": "../../tsconfig.json",
                      "compilerOptions": {
                          "outDir": "../out-tsc/app",
                          "types": []
                   },
                  

                  我的问题是这个tsconfi.app.json 中的空types - 它破坏了基本配置中的那个。

                  【讨论】:

                    【解决方案20】:
                    import * as mongoose from 'mongoose'
                    

                    【讨论】:

                      【解决方案21】:

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

                      所以,我在tsconfig.json

                          "types": [
                            "node"
                          ]
                      

                      还有这个src/tsconfig.app.json:

                          "types": []
                      

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

                      【讨论】:

                      • 这是我面临的问题。谢谢
                      • 我们遇到了同样的问题。此注释有助于将“节点”包含在正确的文件中;在我们的例子中,我们需要调整 tsconfig.lib.json 文件,因为它是主项目的子模块。
                      【解决方案22】:

                      对我来说,这是通过将 types 添加到 Angular 编译器选项来解决的。

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

                      【讨论】:

                      • 它在 tsconfig.json 中,任何人都想知道。
                      • 这是 Angular 9 的。
                      【解决方案23】:

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

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

                      npm i @types/node --save-dev
                      

                      然后在你的 tsconfig 文件中:

                      tsconfig.json

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

                      然后创建你的打字文件:

                      typings.d.ts

                      import 'node/globals'
                      

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

                      【讨论】:

                        猜你喜欢
                        • 2017-06-23
                        • 2023-02-15
                        • 2016-12-16
                        • 2016-09-02
                        • 2020-11-14
                        • 2017-03-29
                        • 2016-12-18
                        • 2019-05-06
                        • 2019-08-09
                        相关资源
                        最近更新 更多