Typescript:モジュールの外ではimportステートメントを使用できません


19

node js(07.10.19のnode.jsの最新バージョン)アプリに.tsファイルがあり、デフォルトのエクスポートなしでnode-moduleをインポートしています。私はこの構造を使用しimport { Class } from 'abc';ますCannot use import statement outside a module。コードを実行すると、次のエラーが発生します。

ネットワークでは、この問題(.jsの場合)の多くの解決策が見られますが、typescriptファイルがあるため、それは私には役に立ちません。これが私のコードです:

import { Class } from 'abc';
module.exports = { ...
    execute(a : Class ,args : Array<string>){ ...

ここに私のtsconfig.jsonがあります:

{
  "compilerOptions": {
    "target": "es6",
    "module": "commonjs",

    "strict": true
  }
}

これをブラウザーで実行していますか?あるimport文は、ファイルの最初の行?
エバート

1
tsconfig.jsonファイルを投稿できますか?Typescriptでコンパイルすると、生成するモジュールのタイプを判別できます。有効なタイプは、使用する環境(ブラウザー/ NodeJS)と使用する他のモジュール(requirevs import)によって異なる場合があります。ただ、あなたにこれをされた複雑な方法の意味を与えるために、ノードは、いくつか持っている文書についてのimportrequireとどのようにそれらを一緒に動作させるためには。
Jeff Bowman、

1
module.exports構文を使用している場合は、おそらくES6モジュールではありません。
Bergi、

エバート、これはノードのjsアプリです。tsconfigはまもなく追加されます
Zerumi

OK、構築を使用するときに名前空間「abc」が見つからないため、requireを使用できませんexecute(a : abc.Class...
Zerumi

回答:


5

“type”: “module”package.jsonに追加すると、NodeにES2015モジュールを使用していることを通知します。これにより、エラーは解消されます“module”: “es2015”“commonjs”、tsconfig.jsonの代わりにを設定することにより、Typescriptにこのタイプのモジュールを生成するように指示する必要があります。

ただし、これにより、現在のコードで問題が発生します。これは、ES6 import {}ステートメントを使用しているのに、commonJS module.exports = {}構文を使用してエクスポートしているため、NodeのESモジュールローダーに問題があるためです。これに対処するには2つの方法があります。

  1. 保持しますmodule.exports、.cjs拡張子を付けてこのファイルをcommonJSとして解釈するようにNodeに指示します。
  2. exportステートメントをES2015構文に変更します。 export function execute(…)..

最初のオプションは、コンパイラーが.jsファイルを出力し、常に(私が知る限り).cjsに変更する必要があるため、少しトリッキーになる可能性があります。2番目のオプションを使用すると、ノードでファイルを実行できるはずです(バージョン13.8未満の--experimental-modulesフラグを含む)。

commonJSを絶対に使用する必要がある場合は、Node:@ types / nodeのタイプ定義をインストールして、インポートをcommonJS形式に変更しrequire('abc')、残りの設定をそのままにしておくことをお勧めします(ただし、「type」を追加できます) :明示するために、package.jsonの「commonjs」)。


1
require( 'abc')。Classは.ts定義では使用できません(a:Classなど)... .cjs拡張子について...型は.tsファイルでのみ使用できます... ES2015も使用するため、私の選択ではありませんこのモジュールはどこでも古いインポート(必須)です... JSDocを使用してこの問題を解決しました。答えてくれてありがとう
ゼルミ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.