問題は、"problematic aspect"の「新しい」キーワードではなく、実際的なアプローチの方が多くあります。Typescript、import、 "new"、コンストラクタ、およびインターフェイス?
クラス(ES2015)を定義するときに、私のC#とJavaScriptの考え方と少し戦っています。 C#では、依存関係注入を使用して、クラスのコンストラクタに依存関係を注入します。 JavaScriptでは、プロトタイプの性質上、コンストラクタに依存性を注入する必要はないことを知りました。あとでユニットテストのためにメソッドを後でモックできるので、import
を安全に使うことができます。
したがって、多くのモジュールは、インスタンス化する必要なく、すぐに使用できます。 (ノードモジュールは例です)
私は自分のプロジェクトでTypeScriptを使用しています。ご存じのように、インターフェイスを使用することができます。私が今行ってきたことは、インターフェイスをプロパティとして設定し、それから問題のクラスを設定することです。
class A implements Letter {
hello(){
console.log("Hello World");
}
}
とそのインターフェース "手紙":
interface Letter {
hello(): void
}
それから私が使用するクラス "ブック" を持って、より良い私はクラスAを持っている想像し、言っているものを説明するために
私が言っているアプローチ。
export class Book{
letter : Letter
constructor(){
this.letter = A;
}
Read(){
console.log("We're about to read this chapter!");
this.letter.hello();
}
}
そして、それはこのように使用することができます:
import {A} from './a.ts';
export class BookVersionJs{
Read(){
console.log("We're about to read this chapter!");
A.Hello();
}
}
:
import {Book} from './book'
let book = new Book();
book.Read();
一方、私は、任意のインターフェイスを使用して、それを直接実装していない "BookVersionJs" を持っています
次に、このように使用できます。
import {BookVersionJs} from './BookVersionJs'
BookVersionJs.Read();
しかし、私はインターフェイスが私に与える "理論的"緩いカップリングを失う。理論的には、JavaScriptがプロトタイプで上書きする可能性があるためです。
実用性に違いがあります。 TypeScript/JavaScriptのどちらを目指すべきですか?それとも、それは意見の問題ですか?
「Ahello()」はインスタンスではなくクラスであるため、実行できません。 'new A()。hello()'を実行するか、 'hello'メソッドを静的にする必要があります。 –
@NitzanTomer Oooooohhhhhh私はついにそれを得た。事は、私が蒸散のためにいつも混乱していたことです。この回答は、私が何を言おうとしていたかに大きく関わっています。 https://stackoverflow.com/questions/20534702/node-js-use-of-module-exports-as-a-constructor https://stackoverflow.com/a/20534942/1057052 –
問題が解決しました。あなたのコメントのおかげで、私が探していたものを見つけることができました;) –