94

TypeScript ファイルがいくつかあります。

MyClass.ts

class MyClass {
  constructor() {
  }
}
export = MyClass;

MyFunc.ts

function fn() { return 0; }
export = fn;

MyConsumer.ts

import * as MC from './MyClass';
import * as fn from './MyFunc';
fn();

これにより、使用しようとするとエラーが発生しますnew

モジュール "MyClass" は非モジュール エンティティに解決されるため、この構成を使用してインポートすることはできません。

そして電話をかけようとするとfn()

型に呼び出しシグネチャがない式を呼び出すことはできません。

何を与える?

4

4 に答える 4

161

うまくいかない理由

import * as MC from './MyClass';

これは ES6/ES2015 スタイルのimport構文です。これの正確な意味は、「ロードされたモジュールの名前空間オブジェクト./MyClassを取得し、それをローカルで使用するMC」です。特に、「モジュール名前空間オブジェクト」は、プロパティを持つプレーンなオブジェクトのみで構成されています。ES6 モジュール オブジェクトは、関数として、または を使用して呼び出すことはできませんnew

繰り返しますが、ES6 モジュールの名前空間オブジェクトは、関数として、または で呼び出すことはできませんnew

importモジュールから使用するもの* as Xは、プロパティのみを持つように定義されています。ダウンレベルの CommonJS では、これは完全に尊重されていない可能性がありますが、TypeScript は、標準で定義されている動作が何であるかを示しています。

何が機能しますか?

このモジュールを使用するには、CommonJS スタイルのインポート構文を使用する必要があります。

import MC = require('./MyClass');

両方のモジュールを制御する場合は、export default代わりに次を使用できます。

MyClass.ts

export default class MyClass {
  constructor() {
  }
}

MyConsumer.ts

import MC from './MyClass';

私はこれについて悲しいです。ルールはばかです。

ES6 のインポート構文を使えばよかったのですが、今はこのようなことをしなければなりませimport MC = require('./MyClass');んか? 2013年ですね!ラメ!しかし、悲しみはプログラミングの正常な部分です。Kübler-Ross モデルのステージ 5: 受け入れにジャンプしてください。

ここの TypeScript は、機能しないため、これが機能しないことを示しています。ハック (namespace宣言を追加することMyClassは、これが機能するふりをする一般的な方法です) があり、現在、特定のダウンレベル モジュール バンドラー (ロールアップなど) で機能する可能性がありますが、これは幻想ですES6 モジュールの実装はまだ公開されていませんが、それが永遠に続くわけではありません。

将来の自分を想像してみてください。neato ネイティブ ES6 モジュール実装で実行しようとして、ES6 構文を使用して ES6 が明示的に実行しないことを実行しようとして、大きな失敗を覚悟していることに気付きます

非標準のモジュールローダーを利用したい

default存在しない場合にエクスポートを「役立つ」ように作成するモジュールローダーがあるかもしれません。つまり、人々は何らかの理由で標準を作成しますが、標準を無視することは楽しいこともあり、それはクールなことだと考えることができます。

MyConsumer.tsを次のように変更します。

import A from './a';

allowSyntheticDefaultImportsコマンドラインまたはtsconfig.jsonオプションを指定します。

allowSyntheticDefaultImportsコードの実行時の動作はまったく変更されないことに注意してください。defaultモジュールローダーが存在しない場合にエクスポートを作成することを TypeScript に通知する単なるフラグです。以前は機能していなかったコードが、nodejs で魔法のように機能することはありません。

于 2016-09-09T16:08:31.953 に答える
5

プロジェクトに npm debounce パッケージを含めようとすると、このエラーが発生しました。

上記の受け入れられた解決策を試したところ、例外が発生しました。

ECMAScript モジュールを対象とする場合、インポート割り当ては使用できません。代わりに、「import * as ns from "mod"」、「import {a} from "mod"」、「import d from "mod"」、または別のモジュール形式を使用することを検討してください。

これはうまくいきました:

import debounce from 'debounce' 
于 2018-03-31T20:53:03.823 に答える