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()
を呼び出そうとしたとき
型に呼び出し署名がない式を呼び出すことはできません。
何が得られますか?
import * as MC from './MyClass';
これはES6/ES2015スタイルのimport
構文です。これの正確な意味は、「./MyClass
からロードされたモジュールnamespace objectを取得し、MC
としてローカルで使用する」です。特に、「モジュール名前空間オブジェクト」は、プロパティを持つプレーンオブジェクトのみで構成されます。 ES6モジュールオブジェクトは、関数として、またはnew
を使用して呼び出すことはできません。
もう一度言うと:ES6モジュール名前空間オブジェクトは、関数として、またはnew
で呼び出すことはできません
モジュールから* as X
を使用してimport
するものは、プロパティのみを持つように定義されています。ダウンレベルの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
に追加することは、この動作のふりをする一般的な方法です)、それらはmight特定のダウンレベリングモジュールバンドルで動作します(たとえば、ロールアップ)が、これは幻想です。まだES6モジュールの実装はまだありませんが、それは永遠に真実ではありません。
将来の自分を想像して、ネイトのネイティブES6モジュールの実装で実行しようとし、ES6構文を使用してES6が明示的にしないことを試みることで、重大な障害に備えていることを見つけますt do。
たぶん、もし存在しないときにdefault
エクスポートを「助けて」作成するモジュールローダーがあるでしょう。つまり、人々は何らかの理由で標準を作成しますが、標準を無視するのは時々楽しいことです。
MyConsumer.tsを次のように変更します。
import A from './a';
そして、allowSyntheticDefaultImports
コマンドラインまたはtsconfig.json
オプションを指定します。
allowSyntheticDefaultImports
は、コードの実行時の動作をまったく変更しないことに注意してください。これは、存在しない場合にモジュールローダーがdefault
エクスポートを作成することをTypeScriptに通知する単なるフラグです。以前はなかったのに、nodejsでコードが魔法のように動作することはありません。
TypeScript 2.7は、新しいヘルパーメソッドを発行することでサポートを導入します。 https://www.typescriptlang.org/docs/handbook/release-notes/TypeScript-2-7.html#support-for-import-d-from- cjs-form-commonjs-modules-with --- esmoduleinterop
そのため、tsconfig.jsonに次の2つの設定を追加します。
{
// Enable support for importing CommonJS modules targeting es6 modules
"esModuleInterop": true,
// When using above interop will get missing default export error from type check since
// modules use "export =" instead of "export default", enable this to ignore errors.
"allowSyntheticDefaultImports": true
}
そして今、あなたは使用することができます:
import MyClass from './MyClass';
ここに私の2セントを追加すると、他の誰かがこの問題を抱えていることになります。
tsconfig.json
(一部のプロジェクトでは問題になる可能性があります)を変更せずに問題を回避する私の方法は、onelineのルールを無効にするだけです。
import MC = require('./MyClass'); // tslint:disable-line
プロジェクトにnpm debounceパッケージを含めようとすると、このエラーが発生しました。
上記の受け入れられた解決策を試したときに、例外が発生しました。
ECMAScriptモジュールを対象とする場合、インポート割り当ては使用できません。代わりに「import * as ns from "mod"」、「import {a} from "mod"」、「import d from "mod"」、または別のモジュール形式を代わりに使用することを検討してください。
これは機能しました:
import debounce from 'debounce'