2016-08-02 8 views
2

私はnodeJS + Typescriptで開発中です。私はオブジェクト指向の背景を持ち、nodejsモジュールの恩恵を受けたいと思っていますが、モジュールではないクラスにそれらを混在させるのに苦労しています。TypescriptとNodeJSを使用してクラスにモジュールを挿入する方法

これは私がやろうとしているものです:

foo.ts(モジュール)

import http = require("http") 

export class Foo { 
    public fooMethod() : number { ... } 
} 

bar.ts(モジュールことになっていない)

namespace Ns { 
    export class Bar { 
     constructor(private foo: Foo) { ... } //"Foo" is not being found by the intellisense 
     public barMethod() : number { 
      return this.foo.fooMethod() 
     } 
    } 
} 

server.js(ノード起動ファイル)

このようなコードを構築しようとしたとき、私は直面しています
var Foo = import("./foo"); 

var foo = new Foo(); 
foo.configure(...)  //Configure foo before inject it into bar 

var bar = new Ns.Bar(foo) 

問題:

  1. バーFooのを見ることはできません。ファイルへの参照を追加しようとしましたが、動作しませんでした。
  2. 私は./fooをインポートしたときに機能しましたが、そのときはバーは、同じ名前空間に定義されている他のファイルの他のエクスポートされたタイプを見ることができません。 、名前空間を含める、それはまだそれを見ることができません)。
  3. 名前空間を削除しましたNsバー名前空間に名前を入力すると他のタイプが表示されることがありました。しかし今はバーはモジュールであり、私はFooがインポートされているので、私のコンストラクタインジェクションの臭いのように感じ、それを直接インスタンス化することができます。

私は自分の基準を強制する必要はありません。私は何をしようとしているのかについて正しいアプローチが何かを知りたい。この闘争は、nodejsアプリケーションを開発するときに、私が再設計して完全なモジュールにする義務があると感じさせます。そうですか?

完全なモジュールにする必要がある場合は、どのように依存性注入を管理する必要がありますか?

あなたはBarクラスによって特定の実装MyFooの使用して非表示にするinterface Fooを使用する必要があり、完全に(Interface-based programmingまたはプロトコル指向プログラミングを言うためにまたはより良い)OOPのパワーを活用するには、あなたに

答えて

1

ありがとうございます。

Foo.ts

export interface Foo { 
    fooMethod(): number; 
} 

MyFoo.ts

export class MyFoo { 
    fooMethod(): number { 
    return 1; 
    } 
} 

バー。他のTS

import {Foo} from './Foo' 

export class Bar { 
    constructor(private foo: Foo) {} 

    barMethod(): number { 
    return this.foo.fooMethod(); 
    } 
} 

どこか:

import {Boo} from './Boo' 
import {MyFoo} from './MyFoo' 

const result = new Boo(new MyFoo()).barMethod(); 

個人的に私は名前空間を使用することをお勧めしません。名前空間とモジュールの詳細については、hereを参照してください。

+0

私はあなたの意見を参照してください。このアプローチはうまくいき、実際には推奨されるようです。しかし、最初の見方では、このパターンは私が多くの小さな結束クラス(別のファイルの各クラス)と多くの注入レベルで動作する場合、私はある種の「インポート地獄」に遭遇する可能性があると感じさせます。それが本当の懸念であるかどうか知っていますか? – Minduca

+1

あなたは多くの小さなモジュール(クラス)を持ち、それぞれはインターフェイスとして注入される他のモジュールの数に依存します( 'class Bar'は' interface Foo'に依存するため)。この数字が小さいほど、モジュールが結合され、ソフトウェアがより良く設計されます。 – mixel

+0

いい説明。ありがとうございました。したがって、私は(1)モジュール用のインターフェイスを作成し、それを1つの実装にする場合でもインターフェイスを持つという欠点がある、または(2)インターフェイスをバイパスし、インテリセンスを活用するために具体的なタイプをインポートして参照することができますタイプをBarのスコープにロードするという欠点があります。たとえそれをインスタンス化するつもりはないとしてもです。私の考えは正しいですか? – Minduca

関連する問題