2017-06-21 271 views
0

這個問題不是關於"problematic aspect"中的「新」關鍵字,而是更實用的方法。Typescript,import,「new」,構造函數和接口?

在定義類時(ES2015),我正在用C#和JavaScript思維模式進行一點鬥爭。在C#中,我使用依賴注入來在類的構造函數中注入依賴關係。在JavaScript中,由於其原型性質,我學到了不需要爲構造函數注入依賴項;您可以安全地使用import,因爲稍後您可以在單元測試中模擬該方法。

因此,許多模塊開箱即用,不需要實例化它們。 (節點模塊是例子)

我一直在我的項目中使用TypeScript。如您所知,您可以使用Interfaces。到目前爲止,我一直在做的是將接口設置爲屬性,然後將相關類設置爲它。

爲了更好地說明我在說什麼,想象我有A類:

class A implements Letter { 
    hello(){ 
     console.log("Hello World"); 
    } 
} 

及其接口 「家書」:

interface Letter { 
    hello(): void 
} 

然後,我有一類 「圖書」,它採用我說的方法。

export class Book{ 
    letter : Letter 
    constructor(){ 
     this.letter = A; 
    } 
    Read(){ 
     console.log("We're about to read this chapter!"); 
     this.letter.hello(); 
    } 
} 

它可以這樣使用:

import {Book} from './book' 
let book = new Book(); 
    book.Read(); 

在另一方面,我有誰不使用任何接口 「BookVersionJs」,並直接實現它:

import {A} from './a.ts'; 

export class BookVersionJs{ 
    Read(){ 
     console.log("We're about to read this chapter!"); 
     A.Hello(); 
    } 
} 

然後我們可以這樣使用它:

import {BookVersionJs} from './BookVersionJs'  
    BookVersionJs.Read(); 

但是我放棄了接口給我的「理論」鬆散耦合。理論上,因爲JavaScript可以用原型覆蓋它們。

實用性有所不同。我應該在TypeScript/JavaScript中瞄準哪一個?或者這是一個意見問題?

+2

你不能做'A.hello()',因爲'A'是一個類,而不是一個實例。您需要執行'new A()。hello()'或使'hello'方法成爲靜態。 –

+0

@NitzanTomer Oooooohhhhhh我終於明白了。事情是,我總是困惑,因爲transpiling。這個答案在我想說的很多。 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

感謝米奇。我在TypeScript上的單個文檔上執行代碼的速度非常快,沒有檢查任何內容。我真正要問的是,如果TypeScript/JavaScript的做事方式最好不要實例化一個類並直接使用靜態方法,還是應該繼續Java/C#方式和「新」對象? –

+1

這可能是主觀的,但我說是的,絕對使用'new'; *尤其*如果您使用的是TypeScript而不是普通的JavaScript。 TypeScript完全支持整個基於類的方法,並且回到更加實用的風格意味着使用TypeScript會有點多餘和浪費。 – Mitch

相關問題