2017-11-21 22 views
0

this simple queue implementationの入力ファイルを作成しようとしています。私のTSプロジェクトでTypeScript宣言ファイルで定義されたクラスを使用するにはどうすればよいですか?

、私はcustomTypingsというフォルダを作成し、私のtsconfig.jsonファイルのtypeRootsプロパティにそれを指摘してきました。

ここに私の.d.tsファイルは次のようになります。私はインポート

declare module 'queue-fifo' { 
    export default class Queue { 
     constructor(); 
     isEmpty(): boolean; 
     size(): number; 
     clear(): void; 
     enqueue(data: any): void; 
     dequeue(): any; 
     peek(): any; 
    } 
} 

は通りです:import Queue from 'queue-fifo';

そして私はQueueクラスのインスタンスを作成しよう:const queue = new Queue();

この時点では、VSコードにタイプエラーはなく、コンパイルエラーも発生しません。

Exception has occurred: TypeError 
TypeError: queue_fifo_1.default is not a constructor 
    at BinarySearchTree.bfs (/../binarySearchTree.ts:110:23) 
    at testBst (/../binarySearchTree.ts:139:10) 
    at Object.<anonymous> (/../binarySearchTree.ts:144:1) 
    at Module._compile (module.js:632:14) 
    at Object.Module._extensions..js (module.js:646:10) 
    at Module.load (module.js:554:32) 
    at tryModuleLoad (module.js:497:12) 
    at Function.Module._load (module.js:489:3) 
    at Function.Module.runMain (module.js:676:10) 
    at startup (bootstrap_node.js:187:16) 

私はその線で破断した場合、私はQueue(私が輸入するもの)は未定義ですが、queue_fifo_1定義されて見て、私は、デバッガを通じて自分のコードを実行しようとするとしかし、私が取得しますデバッグコンソールの中でその名前を使ってクラスのインスタンスを作成することができます。

この望ましくない動作を引き起こしている宣言の宣言/消費において、私が間違っていることを説明できる人はいますか?

+0

あなたのメインtsファイルに 'export class Queue'を使ってみてください – ranakrunal9

答えて

2

ソリューション

queue-fifoモジュールはES6の輸入と互換性がありません、そして、あなたには、デフォルトのエクスポートを与えないCommonJSスタイルexport = Queueを、使用しています。 correct type definitionは同じexport =スタイルの構文を使用する必要があります:

CommonJS形式のインポート使用してインポートすることができ
declare module "queue-fifo" { 
    class Queue { 
     isEmpty(): boolean; 
     size(): number; 
     // etc 
    } 
    export = Queue; 
} 

import Queue = require("queue-fifo"); 
const queue = new Queue(); 

ES6輸入を

それが可能だ場合は、迷っている場合このモジュールをES6構文を使用してインポートするには、おそらく名前空間定義のハックを使用できます。

class Queue { /* ... */ } 
namespace Queue { /* empty */ } 
export = Queue; 

その後ES6のワイルドカードを使用して、それをインポートします。

import * as Queue from "queue-fifo"; 
const queue = new Queue(); 

しかし、これは例えばのWebPACKやロールアップなどのbundlers今日この作業を行うが、将来ES6準拠したモジュールシステムはなりません、非ES6環境で動作しますこの仕事をすることができます。もっと詳しく見る:What does "... resolves to a non-module entity and cannot be imported using this construct" mean?

+0

ファンタスティックな答えですが、 "export as namespace"は、.d.tsファイルのUMDモジュールを定義するために使用される 'export as namespace some_identifier'構文と簡単に混同されるかもしれません。 –

+0

良い点、そのフレーズを削除しました:) – Aaron

+0

パーフェクト。解決と説明のおかげで非常に感謝します。自分の実装を練習しているときに、単純化のために 'number'を使って実装したので、私はこの実装をプロジェクトですばやく使用しようとしていました。答えを待っている間、私はTypeScriptのジェネリックスについて学び、それを使用するように実装を変換しました。 Win-Win! :) –

関連する問題