首页 文章

打字稿得到错误TS2304:找不到名字' require'

提问于
浏览
324

我试图让我的第一个Typescript和DefinitelyTyped节点应用程序启动并运行,并遇到一些错误 .

当我尝试转换一个简单的ts节点页面时,我收到错误"TS2304: Cannot find name '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文件似乎工作正常,所以我可以忽略错误 . 但我很想知道为什么会出现这种错误以及我做错了什么 .

17 回答

  • 4

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

    我有这个恼人的问题一段时间,找不到解决方案,但最终以这种方式解决了 . 希望这对某人有帮助 .

  • 9

    如果你在ts文件中遇到这个问题,那里只为你提供一些常量值,那么你可以

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

    并且错误不会再来了 .

  • 0

    快速而肮脏

    如果你只有一个文件使用require,或者你是为了演示目的而这样做,你可以在TypeScript文件的顶部定义require .

    declare var require: any
    

    TypeScript 2.x.

    如果您使用的是TypeScript 2.x,则不再需要安装Typings或Definitely Typed . 只需安装以下包 .

    npm install @types/node --save-dev
    

    The Future of Declaration Files (6/15/2016)

    打字和tsd等工具将继续有效,我们将与这些社区合作,确保平稳过渡 .

    OPTIONAL: 如果您在 tsconfig.json 中指定 typerootstypes . 您可能需要将 tsconfig.json 更新为包含节点作为类型 . 默认情况下,@types下的任何包都已包含在您的构建 unless 中,您已指定其中任何一个选项 . 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"
             ]
        }
    }
    

    TypeScript 1.x

    使用typings(DefinitelyTyped的替换),您可以直接从GitHub存储库指定定义 .

    安装打字

    npm install typings -g --save-dev
    

    从DefinitelyType的repo安装requireJS类型定义

    typings install dt~node --save --global
    

    Webpack

    如果您使用Webpack作为构建工具,则可以包含Webpack类型 .

    npm install --save-dev @ types / webpack-env

    compilerOptions 下使用以下内容更新 tsconfig.json

    "types": [
          "webpack-env"
        ]
    

    这允许您执行 require.ensure 和其他Webpack特定功能 .

    Angular CLI

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

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

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

    确保已安装 npm i @types/node

  • 2

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

    除了cgatian的答案之外, TypeScript 1.x

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

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

    代替:

    'use strict';
    
    /// <reference path="typings/tsd.d.ts" />
    

    尝试:

    /// <reference path="typings/tsd.d.ts" />
    
    'use strict';
    

    即首先参考路径 .

  • 0

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

    • install preprocessor-loader:
    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,它会切断最后一行,所以只需要确保最后有一个额外的行空间返回,你就可以了 .

  • 5

    我也一直在努力解决这个问题 . 我相信这适用于所有发布候选人,即rc,但我没有测试 . 对于 @angular rc.2 ,效果很好 .

    • package.json 中添加 core-js 作为npm依赖项

    • 运行 typings install core-js --save

    • 删除 package.json 中的所有 "es6-shim" 个出现 . 你不再需要它了 .

    干杯!

  • 0

    这个答案涉及现代设置(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

  • 0

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

    • 安装定义 require 的包 . 例如:
    npm install @types/node --save-dev
    
    • 告诉TypeScript将其全局包含在_153503中:
    {
        "compilerOptions": {
            "types": ["node"]
        }
    }
    

    第二步仅在您需要访问全局可用功能(例如 require )时才重要 . 对于大多数软件包,您应该只使用 import package from 'package' 模式 . 不需要在上面的tsconfig.json类型数组中包含每个包 .

  • 1

    您可以

    declare var require: any
    

    或者,要获得更全面的支持,请使用DefinitelyTyped's require.d.ts

    另外,您可以尝试以下操作,而不是 var mongoose = require('mongoose')

    import mongoose from 'mongoose' // or
    import mongoose = require('mongoose')
    
  • 0

    我无法通过使用上述任何技巧来消除'require'错误 .

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

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

    https://www.microsoft.com/en-us/download/details.aspx?id=48593

  • 1

    有时从tsconfig.json中丢失"jasmine"可能会导致此错误 . (Typescript 2.X)

    所以加

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

    你的tsconfig.json

  • 62

    电子角2/4添加:除了将'node'类型添加到ts.config各种文件之外,最终对我有用的是添加typings.d.ts文件的下一个:

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

    请注意,我的情况是用电子角2/4发展 . 我需要窗口全局的需求 .

  • 7
    • 您是否指定了用于转换代码的模块?
      tsc --target es5 --module commonjs script.ts
      您必须这样做才能让转换器知道您正在编译NodeJS代码 . Docs .

    • 您还必须安装mongoose定义
      tsd install mongoose --save

    • 不要使用 var 来声明变量(除非必要,这是一种非常罕见的情况),请改用 let . Learn more about that

  • 73

    tsconfig.json 中添加以下内容:

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

相关问题