2016-06-29 4 views
0

node.jsには、モジュールファクトリパターンを活用するためのよく知られた方法があります。例:Typescriptモジュールのファクトリパターン

m.js

は、私はtypescriptですで同じことを行うことができますどのように

var o = require('./m')(module); 
// using o 

をapp.js。実際、m.tsを作成することは問題ではありません。

m.ts

function factoryMethod(module: NodeModule): any { 
    // doing some stuff 
} 

export = factoryMethod; 

しかし、どのように私はJavaScriptでのように、このモジュールファクトリメソッドを使用して、インポートの構文を使用する必要がありますか?

答えて

1

私はこの共通パターンをかなり得ているとは確信していません。あるモジュールから別のモジュールにmoduleオブジェクトを渡していますか?あらゆる種類の他のオブジェクトがこのように渡されます(例:appdb)。moduleオブジェクトの周りを渡すという考えは嫌いです。私はそれを反パターンと呼ぶように誘惑されるだろう。確かに、moduleオブジェクトは、それが属するモジュールにとどまるべきです。

つまり、同じ行の関数をインポートして呼び出したいのであれば、とすることができます。通常のJavaScriptと同様に、ノードのrequire()関数を使用します。たとえば、moduleではなく、appというExpressを渡しているとします。

const o = require('./m')(app); 

ただし、これでタイプセーフティが失われます。 oanyとなります。タイプはoと明示的に定義する必要があります。

const o: Module = require('./m')(app); 

これは少し愚かです。実際、Moduleは、あなたが必要としているモジュールに定義されている可能性が高いため、自滅する可能性があります。私の提案はこれです。独自のパターンを持つTypeScriptでは、普通のJSと同じパターンを使用することを期待しないでください。

あなたができることの1つは、上部に関数をインポートし、後で呼び出すことです。 TypeScriptはES2015-style modulesを使用しますが、関数をインポートして同じ行に呼び出すことはできません。 export =はES2015では無効なので、両方のファイルを書き直す必要があります。

// m.ts 

interface Module { 
    // properties, methods, etc. 
} 

export function factoryMethod(app: Express.Application): Module { 
    let module = {}; 
    // Initialize module methods, properties, etc. 
    return module; 
} 

のインタフェース許可型の推論は、種類の改良です。

// app.ts 

import {factoryMethod} from './m'; 

// ... 

let o = factoryMethod(app); 

これはまだ非常に愚かです。私たちはインターフェースとそのナンセンスを定義する必要はありません。代わりにクラスを使用できます。クラスはTypeScriptの答えであることが多く、TypeScriptのほとんどのパターンはクラスに関係しています。

// m.ts 

export class Module { 

    constructor(private app: Express.Application) { } 

    cache: string[]; 

    someMethod(): Promise<Express.Response> { 
    // do something with this.app 
    } 

} 

そしてapp.ts

import {Module} from './m'; 

// ... 

let o = new Module(app); 

に今、私たちは、インタフェースおよびすべてのことを心配する必要はありません。クラス自体は型です。これは、典型的なNodeアプリケーションで見られる可能性のあるものとはかなり異なりますが、TypeScriptでは常に見つかったパターンのようなものです。

うまくいけば、それはあなたにいくつかのアイデアを提供します。

+0

お返事ありがとうございます。モジュールをパラメータとして使用するのは例のようでした。一般的なアイデアは何らかの種類の工場パターンを持つことでしたが、モジュールを使用することは必須ではありません。さて、どうも、ありがとう。 –

+0

@AndreiTarutin OK、私は全く気づかなかった奇妙なパターンがあると思った。私は助けることができてうれしいです。 – McMath

1
import {factoryMethod} from './m.ts' 


let module = factpryMethod('module'); 
+0

実際、私はjavascriptのように、1行にインポートと初期化を加えたものです。 –

関連する問題