這個問題不是關於"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中瞄準哪一個?或者這是一個意見問題?
你不能做'A.hello()',因爲'A'是一個類,而不是一個實例。您需要執行'new A()。hello()'或使'hello'方法成爲靜態。 –
@NitzanTomer Oooooohhhhhh我終於明白了。事情是,我總是困惑,因爲transpiling。這個答案在我想說的很多。 https://stackoverflow.com/questions/20534702/node-js-use-of-module-exports-as-a-constructor https://stackoverflow.com/a/20534942/1057052 –
是的。問題解決了。感謝您的評論,我設法找到我正在尋找的;) –