TypeScript获取错误TS2304:不能找到名称'需要# 39;

我试图让我的第一个TypeScript和DefinitelyTyped 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. d的内容。Ts文件是:

/// <reference path="node/node.d.ts" />
/// <reference path="requirejs/require.d.ts" />

.d。Ts文件引用被放置在适当的文件夹中,并添加到typings/tsd.d。通过命令:

tsd install node --save
tsd install require --save

生成的.js文件似乎工作正常,所以我可以忽略这个错误。但我想知道为什么这个错误发生,我做错了什么。

712408 次浏览

你可以

declare var require: any

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

此外,除了var mongoose = require('mongoose')之外,您还可以尝试以下方法

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

而不是:

'use strict';


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

试一试:

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


'use strict';

即先参考路径。

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

我用彼得·瓦尔加的回答是添加了declare var require: any;,并使其成为一个通用的解决方案,适用于所有.ts文件,使用preprocess-loader:

  1. < p >安装preprocessor-loader:

    npm install preprocessor-loader
    
  2. add the loader to your webpack.config.js (I'm using ts-loader for processing TypeScript sources):

    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;在我的情况下已经足够了。

注意,1.0.5预处理器有一个bug截断了最后一行,所以只要确保在末尾返回一个额外的行空间就可以了。

又快又脏

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

declare var require: any

打印稿2.倍

如果你使用的是TypeScript 2。x你不再需要安装Typings或Definitely Typed。只需安装以下包。

npm install @types/node --save-dev

声明文件的未来(6/15/2016)

Typings和tsd等工具将继续工作,我们将继续工作 以确保平稳过渡。

验证或编辑src/tsconfig.app。Json,以便它包含以下内容:

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

确保这个文件在src文件夹中,而不是在根应用文件夹中。

默认情况下,@types下的任何包都已经包含在构建除非中,您已经指定了这些选项中的任何一个。# EYZ1

打印稿1.倍

使用类型(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特定的功能。

角CLI

使用CLI,你可以按照上面的Webpack步骤添加"type "block到tsconfig.app.json

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

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

我也一直在为这个问题而挣扎。我相信这适用于所有发布候选,也就是钢筋混凝土,但我没有测试。对于@angular rc.2,它工作得很好。

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

干杯!

  1. 您是否指定了要使用哪个模块来编译代码?< br > # EYZ0 < br > 您必须这样做才能让编译器知道您正在编译NodeJS代码。李# EYZ0。< / p > < / >

  2. 您也必须安装猫鼬定义
    李# EYZ0 < / p > < / >

  3. 不要使用var来声明变量(除非必要,这是非常罕见的情况),而是使用let了解更多关于那个

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

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

    npm install @types/node --save-dev
    
  2. Tell TypeScript to include it globally in tsconfig.json:

    {
    "compilerOptions": {
    "types": ["node"]
    }
    }
    

The second step is only important if you need access to globally available functions such as require. For most packages, you should just use the import package from 'package' pattern. There's no need to include every package in the tsconfig.json types array above.

使用上面的任何技巧都无法消除'require'错误。

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

你可以从以下网站下载最新版本的工具:

TypeScript for Visual Studio 2015

除了cgatian的答案,对于打印稿1.倍

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

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

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

这个烦人的问题困扰了我一段时间,一直找不到解决方法,但我最终用这种方法解决了它。

有时tsconfig中会缺少“jasmine”。Json可能会导致此错误。# EYZ0

所以添加

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

到您的tsconfig.json文件。

tsconfig.json中添加以下内容:

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

电子 + Angular 2/4添加:

除了将“node”类型添加到ts.config各种文件之外,最终对我有用的是将下一个添加到 # EYZ0文件:< / p >

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

注意,我的案例是用Electron + Angular 2/4开发的。我需要window全局的require。

这个答案涉及到现代设置(TypeScript 2。x, Webpack > 2.x)

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

需要安装@types/webpack-env

# EYZ0

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

还要确保您的tsconfig。Json文件没有设置“类型”数组->,这将使它在你的node_modules/@types文件夹中拾取所有类型定义。

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

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

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

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

错误不会再犯。

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

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

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

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

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

我的问题是空的types在这个tsconfi.app.json -它击败了一个在基本配置。

import * as mongoose from 'mongoose'

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

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

    "types": [
"node"
]

这个在src/tsconfig.app.json:

    "types": []

我希望有人发现这有帮助,因为这个错误导致我的头发变白了。

对我来说,这个问题是通过添加类型到angular编译器选项来解决的。

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

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

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

npm i @types/node --save-dev

然后在你的tsconfig文件中:

tsconfig.json

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

然后创建你的类型文件:

typings.d.ts

import 'node/globals'

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

如果你正在使用Yarn v3并且看到这个错误(不能找到name require)或者其他节点相关的“不能找到”;在VSCode中出现错误时,请确保你已经安装了Yarn的VSCode sdk插件,并选择了Typescript的工作空间版本。

安装sdk:

yarn dlx @yarnpkg/sdks

设置Typescript版本:

  1. 选择一个Typescript文件
  2. 按Command + Shift + P
  3. 类型Typescript:选择“Typescript版本”
  • 选择“使用工作区版本”;

更多细节请参见https://yarnpkg.com/getting-started/editor-sdks#vscode