うまくいかない理由
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 で魔法のように機能することはありません。