TypeScriptがエラーTS2304を取得:名前 'require'が見つかりません


463

最初のTypeScriptとDefinitelyTypedのNode.jsアプリケーションを稼働させようとしているところ、いくつかのエラーが発生しています。

単純なTypeScript Node.jsページをトランスパイルしようとすると、「TS2304:名前 'require'が見つかりません」というエラーが発生します。スタックオーバーフローでこのエラーが発生する他のいくつかを読みましたが、同様の問題はないと思います。私はシェルプロンプトでコマンドを実行しています:

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')行にスローされます。

入力/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ファイルは正常に動作しているようなので、エラーは無視できます。しかし、このエラーが発生する理由と私が間違っていることを知っていただければ幸いです。


1
when I attempt to transpile a simple ts node page<どのようにトランスパイルしていますか...どのユーティリティ
バサラト2015

1
コマンドラインでコマンドtsc movie.server.model.tsを入力して実行しています。FWIWこれはMacです。
JerryKur 2015

1
Visual Studio Codeを使用していたIDEでも同じ問題が発生しました。私は他のIDE、IntelliJで試してみます。この問題をテストするには、コマンドラインにドロップするのが最もクリーンな方法だと思いました。
JerryKur


いかがimport { mongoose } from 'mongoose'ですか?
FisNaN 2018

回答:


744

迅速かつ汚い

requireを使用するファイルが1つしかない場合、またはデモ目的でこれを行う場合は、TypeScriptファイルの先頭でrequireを定義できます。

declare var require: any

TypeScript 2.x

TypeScript 2.xを使用している場合は、TypingsまたはDefinitely Typedをインストールする必要はありません。次のパッケージをインストールするだけです。

npm install @types/node --save-dev

宣言ファイルの未来(2016年6月15日)

タイピングやtsdなどのツールは引き続き機能します。スムーズな移行を確実にするために、これらのコミュニティと協力して作業を行います。

以下を含むようにsrc /tsconfig.app.jsonを確認または編集します。

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

ファイルがsrcフォルダーにあり、ルートアプリフォルダーにないことを確認してください。

デフォルトでは、これらのオプションのいずれかを指定しない限り、@ typesの下のパッケージはすべてビルドにすでに含まれています。 続きを読む

TypeScript 1.x

タイピング(DefinitelyTypedの置換)を使用すると、GitHubリポジトリから直接定義を指定できます。

タイピングをインストールする

npm install typings -g --save-dev

DefinitelyTypeのリポジトリから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固有の機能を実行できます。

Angular CLI

CLIを使用すると、上記のWebpackの手順に従い、「types」ブロックをに追加できますtsconfig.app.json

または、プリインストールnodeタイプを使用することもできます。これには、実際には使用できないクライアント側コードの追加の型が含まれることに注意してください。

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

4
なぜ「タイピングのインストール--save --ambient require」だけではないのですか?
kutomer

1
これでエラーが発生しますUnable to find "require" ("npm") in the registry。nodeJSタイピングのより大きなセットの一部が必要ですか?
dcsan

7
ノードの組み込みではなく、requireJSのタイピングに関連するため、これは間違っていますrequire。ES5出力ターゲットのいくつかのバリエーションに対する正しい答えかもしれませんが、一般的なケースではありません。
dcsan 2016

1
ヨルダンの日除けを参照してください。私の場合、次の@typesをインストールしていたため、追加しました-> "types":["node"、 "es6-promise"、 "core-js"、 "jasmine"] <-tsconfig.jsonのcompilerOptionsに
Lothre1

1
@Seagull @types/nodeはTypeScript定義です。ノードにはこれらが含まれていません。
cgatian 2018年

103

TypeScript 2.xの場合、2つのステップがあります。

  1. を定義するパッケージをインストールしますrequire。例えば:

    npm install @types/node --save-dev
  2. TypeScriptにグローバルに含めるように指示しますtsconfig.json

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

2番目のステップは、などのグローバルに使用可能な機能にアクセスする必要がある場合にのみ重要ですrequire。ほとんどのパッケージでは、import package from 'package'パターンを使用する必要があります。上記のtsconfig.jsonタイプの配列にすべてのパッケージを含める必要はありません。


1
一部のes5にlibを使用することもできますgithub.com/Microsoft/TypeScript/wiki/…Eq : "lib":["dom"、 "es5"、 "es2015.promise"、 "es2015.collection"]
Leo Caseiro

に追加"types": ["jasmine", "hammerjs"]した後、tsconfig.jsnodeも追加する必要がありました。ジョーダンに感謝します。
Mikeumus

このアドバイスに従うと、すべてのインポートが無効になります。たとえば、import express from "express";は、@ types / expressをインストールするか、.d.tsファイルを追加する必要があることを通知しています。
austinthemassive

4
あなたがより多く持っている場合は@types/...単なる@types/nodeフォルダを追加しない"types": ["node"]tsconfig.json活字体のcompillerが他の言及されていないパッケージを省略しますので。これは、IDEタイプの解決を壊します。ここに書かれているtypescriptlang.org/docs/handbook/...
Marecky

その解決策は、問題なくイオンプロジェクトで機能します。ありがとうございました:)
Fran Sandi

71

あなたはできる

declare var require: any

または、より包括的なサポートを得るには、DefinitelyTypedのrequire.d.tsを使用します

また、の代わりにvar mongoose = require('mongoose')、以下を試すこともできます

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

1
use strictTypeScriptでちょうど使用する:TypeScriptファイルで必要なbasarat回答「Use Strict」?use strictTypeScriptで使用する必要があります。
Eugene Bichel、2015年

うーん、その回答によると、それは必要ではありませんが、使用することは有益かもしれません"use strict"。私は私の回答を編集します
ᆼᆺᆼ

declare var requireを使用しても、実際の問題は修正されません。ただ隠すだけ。
私のスタックが

@正解です。これは2015年のものであることを覚えておいてください。また、修正すべき「問題」はないと主張します。TypeScript 2.0はもちろんこれをエレガントに解決します
'2016年

12

この回答は、最新の設定に関連しています(TypeScript 2.x、Webpack > 2.x)。

あなたはしません、実際にそのようsetTimout異なる戻り値などのように、物事を複雑に、Node.jsのタイプのすべてであるとフロントエンドのコードのために無関係である(タイプ/ノード@インストールする必要があります。..

あなたがないタイプ/ WebPACKの-ENV @インストールする必要があります

npm i -D @types/webpack-env

これは、Webpackが持つランタイム署名を提供します(requirerequire.ensureなど)

また、tsconfig.jsonファイルに「types」配列が設定されていないことを確認してください。これにより、node_modules / @ typesフォルダー内のすべての型定義が取得されます。

タイプの検索を制限する場合は、typeRootプロパティをnode_modules / @ typesに設定できます。


1
これは重要な発言です 。tsconfig.jsonに「types」配列が設定されていないことを確認してください。これにより、node_modules / @ typesフォルダー内のすべての型定義が取得されます
Marecky

webpackアプローチで必要な他のステップはありますか?私は、コンパイルエラー`エラーTS2580を得る:名「require'.`見つけることができません
jaycer

10

の代わりに:

'use strict';

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

試してください:

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

'use strict';

すなわち、最初に参照パス。


機能しますが、汚いIMOのようなものです。基本的に、エラーを修正するのではなく非表示にします。デモやクイックスクリプトには
最適

8

私の場合、それは非常に愚かな問題src/tsconfig.app.jsonでした。tsconfig.json設定を。

だから、私はこれを持っていましたtsconfig.json

    "types": [
      "node"
    ]

そしてこれはsrc/tsconfig.app.json

    "types": []

このエラーが私に白髪を引き起こしていたので、誰かがこれが役に立ったと思います


8

参考までに、私はAngular 7.1.4TypeScript 3.1.6を使用していますが、必要なのは次の行を追加することだけですtsconfig.json

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

それをしました。それでもこのエラーが発生する:名前「require」が見つかりません。ノードのタイプ定義をインストールする必要がありますか?試しnpm i @types/nodenodetsconfigのタイプフィールドに追加してください。-npmをインストールしました。
スイス

7

解決策はTSDコマンドを使用することでした:

tsd install node --save

これにより、typings/tsd.d.tsファイルが追加/更新され、そのファイルにはノードアプリケーションに必要なすべてのタイプ定義が含まれます。

ファイルの先頭に、次のtsd.d.tsような参照を追加しました。

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

requireは2016年1月の時点で次のように定義されています。

declare var require: NodeRequire;

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

404が見つかりませんでした
ボーマット

5

私はPeter Vargaの回答を追加してdeclare var require: any;、それをpreprocess-loaderを使用してすべての.tsファイルに対して一般的に機能する一般的なソリューションにしました:

  1. プリプロセッサローダーをインストールします。

    npm install preprocessor-loader
  2. ローダーをwebpack.config.jsに追加します(TypeScriptソースの処理にts-loaderを使用しています)。

    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にはバグがあり、最後の行が途切れることに注意してください。最後に余分な行スペースが返されることを確認してください。問題はありません。


1
なぜこれは反対票が投じられたのですか?それは質問に答えて、新しくて重要な何かをテーブルにもたらします。これで、トランスパイラーとWebパックを満たすために、すべてのファイルを個別に壊す必要はありません。
ベニーボッテマ2016

ステップ3について詳しく説明していただけますか?私は初心者で、この構成コードをどこに置くかわかりません。
user441058

@ user441058、GitHubページのチェックアウト、ステップ3はプリプロセスローダーのメイン構成に関するものです。
ベニーボッテマ2016年

2

私もこの問題に苦労しています。私はこのすべてのための作品と信じているのリリース候補別名RCが、私はテストしませんでしたががあります。@angular rc.2それがうまく動作します。

  1. core-jsnpm依存関係として追加package.json
  2. 走る typings install core-js --save
  3. 内のすべての"es6-shim"出現を削除しますpackage.json。あなたはもうそれを必要としません。

乾杯!


core-jsタイピングは何のためですか?ノード固有?
dcsan



2

tsconfig.jsonから「jasmine」が欠落していると、このエラーが発生することがあります。(TypeScript 2.X)

だから追加

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

あなたのtsconfig.jsonファイルに。


2

電子 +角度2/4の追加:

ts.configのさまざまなファイルに「ノード」タイプを追加することに加えて、最終的に私のために機能したのは、typings.d.tsファイルの隣に追加することでした 。

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

私のケースはElectron + Angular 2/4で開発していることに注意してください。私はグローバルなウィンドウでrequireが必要でした。


2

私にとっては、角度コンパイラオプションにを追加することで解決されます。

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

知りたい人のためにtsconfig.jsonにあります。
Stephen Zeng

1
これは、角度9のためである
アルン

1
  1. コードのトランスパイルに使用するモジュールを指定しましたか?
    tsc --target es5 --module commonjs script.ts
    NodeJSコードをコンパイルしていることをトランスパイラーに知らせるために、これを行う必要があります。ドキュメント

  2. あなたもマングース定義をインストールする必要があります
    tsd install mongoose --save

  3. var変数の宣言には使用しないでください(非常にまれなケースですが、必要な場合を除きます)let詳細はこちら


1

TypeScript 1.xの cgatianの答えに加えて

それでもエラーが発生する場合は、コンパイラオプションで具体的にindex.d.tsを指定してください。

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

1

上記のトリックのいずれかを使用しても、「require」エラーを解消できませんでした。

しかし、問題はVisual Studio用のTypeScriptツールが古いバージョン(1.8.6.0)と今日の最新バージョン(2.0.6.0)であることがわかった。

ツールの最新バージョンは次の場所からダウンロードできます。

TypeScript for Visual Studio 2015


1

コードをコンパイルできるが、Visual Studio 2015は 'require'関数をエラーテキストとしてエラーとしてマークし、名前 'require' が見つからないか、シンボル 'require'を解決できない場合、、TypeScript for Visual Studio 2015を最新バージョンに更新し(現時点では2.1。 5)ReSharper(使用する場合)を少なくともバージョン2016.3.2に更新します。

私はこの厄介な問題をしばらく抱えていて、解決策を見つけることができませんでしたが、最終的にこの方法で解決しました。



1

に説明しnpm install @types/node、に含める以前のすべての答えに基づいて、さらに別の答えを見つけましnodetsconfig.json / compilerOptions / types

私の場合、tsConfig.jsonAngularアプリケーションにベースとこれを拡張する別のベースがあります。

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

私の問題は空だったtypes。この中でtsconfi.app.json-それは、基本構成のものを切り詰め。


-2

いくつかの定数値を提供するためだけに存在する.tsファイルでこの問題に直面している場合は、次のことができます

.tsファイルの名前を.jsファイルに変更します

エラーは再び発生しません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.