这个问题不是关于"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 –
是的。问题解决了。感谢您的评论,我设法找到我正在寻找的;) –