2017-06-21 194 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

相关问题