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

问题描述 投票:369回答:20

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

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

node.js typescript definitelytyped
20个回答
614
投票

快速而肮脏

如果你只有一个文件使用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)

Typing和tsd等工具将继续发挥作用,我们将与这些社区合作,确保顺利过渡。

可选:如果你在typeroots中指定typestsconfig.json。您可能需要更新tsconfig.json以将节点包含为类型。默认情况下,除非您指定了其中任何一个选项,否则@types下的任何包都已包含在您的构建中。 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

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

"types": [
      "webpack-env"
    ]

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

角度CLI

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

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

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

2
投票

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

所以加

"es6-shim"

到你的tsconfig.json


2
投票

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

package.json

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


2
投票

确保你已经安装了"types": [ "node", "jasmine" ]


2
投票

从'mongoose'导入*作为猫鼬


1
投票
  1. 您是否指定了用于转换代码的模块? declare var window: Window; interface Window { process: any; require: any; } 您必须这样做才能让转换器知道您正在编译NodeJS代码。 npm i @types/node
  2. 您还必须安装mongoose定义 tsc --target es5 --module commonjs script.ts
  3. 不要使用Docs声明变量(除非必要,这是一种非常罕见的情况),请改用tsd install mongoose --savevar

1
投票

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

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

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

let


1
投票

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

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

Learn more about that

1
投票

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

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


1
投票

https://www.microsoft.com/en-us/download/details.aspx?id=48593中添加以下内容:

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

1
投票

我还有另一个答案建立在所有以前描述tsconfig.json并包括"typeRoots": [ "../node_modules/@types" ] 中的npm install @types/node的答案之上。

在我的情况下,我有一个基础node和Angular应用程序中的一个单独的扩展这一个:

tsconfig.json / compilerOptions / types

我的问题是这个tsConfig.json中的空{ "extends": "../../tsconfig.json", "compilerOptions": { "outDir": "../out-tsc/app", "types": [] }, - 它破坏了基本配置中的那个。


83
投票

对于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类型数组中包含每个包。


-2
投票

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

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

并且错误不会再来了。


67
投票

您可以

declare var require: any

或者,如需更全面的支持,请使用DefinitelyTyped's require.d.ts

此外,您可以尝试以下方法,而不是var mongoose = require('mongoose')

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

10
投票

代替:

'use strict';

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

尝试:

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

'use strict';

即首先参考路径。


9
投票

这个答案涉及现代设置(typescript 2.x,webpack> 2.x)

你不需要安装@ types / node(这是所有的node.js类型,与前端代码无关,实际上使setTimeout等不同的返回值等复杂化。

你需要安装@ types / webpack-env

npm i -D @types/webpack-env

它给出了webpack所具有的运行时签名(包括require和require.ensure等)。

还要确保你的tsconfig.json没有设置'types'数组 - >这将使它获取node_modules / @ types文件夹中的所有类型定义。如果要限制搜索类型,可以将typeRoot属性设置为node_modules / @ types


7
投票

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

6
投票

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

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

希望它可以提供帮助。


5
投票

我使用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,它切断了最后一行,所以只要确保你在最后有一个额外的行空间返回,你会没事的。


2
投票

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

  1. core-js中将package.json添加为npm依赖项
  2. 运行typings install core-js --save
  3. 删除你的qazxsw poi中的所有qazxsw poi事件。你不再需要它了。

干杯!

© www.soinside.com 2019 - 2024. All rights reserved.