私はこの共通パターンをかなり得ているとは確信していません。あるモジュールから別のモジュールにmodule
オブジェクトを渡していますか?あらゆる種類の他のオブジェクトがこのように渡されます(例:app
、db
)。module
オブジェクトの周りを渡すという考えは嫌いです。私はそれを反パターンと呼ぶように誘惑されるだろう。確かに、module
オブジェクトは、それが属するモジュールにとどまるべきです。
つまり、同じ行の関数をインポートして呼び出したいのであれば、はとすることができます。通常のJavaScriptと同様に、ノードのrequire()
関数を使用します。たとえば、module
ではなく、app
というExpressを渡しているとします。
const o = require('./m')(app);
ただし、これでタイプセーフティが失われます。 o
はany
となります。タイプは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では常に見つかったパターンのようなものです。
うまくいけば、それはあなたにいくつかのアイデアを提供します。
お返事ありがとうございます。モジュールをパラメータとして使用するのは例のようでした。一般的なアイデアは何らかの種類の工場パターンを持つことでしたが、モジュールを使用することは必須ではありません。さて、どうも、ありがとう。 –
@AndreiTarutin OK、私は全く気づかなかった奇妙なパターンがあると思った。私は助けることができてうれしいです。 – McMath