2017-06-21 11 views
0

問題は、"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のどちらを目指すべきですか?それとも、それは意見の問題ですか?

+2

「Ahello()」はインスタンスではなくクラスであるため、実行できません。 'new A()。hello()'を実行するか、 'hello'メソッドを静的にする必要があります。 –

+0

@NitzanTomer Oooooohhhhhh私はついにそれを得た。事は、私が蒸散のためにいつも混乱していたことです。この回答は、私が何を言おうとしていたかに大きく関わっています。 https://stackoverflow.com/questions/20534702/node-js-use-of-module-exports-as-a-constructor https://stackoverflow.com/a/20534942/1057052 –

+0

問題が解決しました。あなたのコメントのおかげで、私が探していたものを見つけることができました;) –

答えて

1

あなたが求めているものを正確に伝えるのは難しいですが、私はあなたのBookの例があなたのBookVersionJsの例よりはるかに多く見えるのは間違いありません。

本を読むことを考えてください。

BookVersionJs

BookVersionJs.Read(); // "I am reading Book" 

ブック

let book = new Book(); 
book.Read(); // "I am reading a Book" 

あなたのオブジェクトは意味的に意味を持たなければならないか、あなたのコードを使用しています誰が非常に混乱してしまいます。

あなたの懸念がテスト可能な場合は、是非、Letterを注入してください。Aは、日常的なコードで使いやすくするためのデフォルトのタイプとして保持し、ユニットテスト中にLetterの異なる実装を提供することができます。

export class Book{ 
    letter : Letter; 
    constructor(letter: Letter = new A()) { // Note: Assign instance of A, not just A. A is a type, not a value. 
     this.letter = letter; 
    } 
    Read(){ 
     console.log("We're about to read this chapter!"); 
     this.letter.hello(); 
    } 
} 
+0

Thanks Mitch。私は何かをチェックすることなく、TypeScript上の単一の文書でコードを本当に速くしました。私が本当に尋ねるのは、TypeScript/JavaScriptのやり方が、クラスをインスタンス化して静的メソッドを直接持たない方がよい場合、あるいはJava/C#の方法を進めてオブジェクトを「新しくする」必要がある場合です。 –

+1

これはおそらく主観的ですが、私はそう、間違いなく 'new'を使っています。 *特に*単純なJavaScriptではなくTypeScriptを使用している場合。 TypeScriptは、クラスベースのアプローチ全体を完全に包含し、より機能的なスタイルに戻ることは、TypeScriptの使用が少し冗長で無駄であることを意味します。 – Mitch

関連する問題