如何使用Typescript和NodeJS将模块注入到类中

我正在开发nodeJS + Typescript。 我有一个面向对象的背景,我想从nodejs模块中受益,但是我正努力将它们与不应该是模块的类混合使用。

这就是我想要做的:

foo.ts(模块)

import http = require("http") export class Foo { public fooMethod() : number { ... } } 

bar.ts(不应该是一个模块)

 namespace Ns { export class Bar { constructor(private foo: Foo) { ... } //"Foo" is not being found by the intellisense public barMethod() : number { return this.foo.fooMethod() } } } 

server.js(节点启动文件)

 var Foo = import("./foo"); var foo = new Foo(); foo.configure(...) //Configure foo before inject it into bar var bar = new Ns.Bar(foo) 

尝试像这样构造代码时遇到的问题:

  1. 酒吧看不到Foo 。 我试图添加一个对该文件的引用,但没有奏效。
  2. 当我导入./foo时,它“工作”,但是当我这样做时, Bar在同一个命名空间中定义的其他文件中看不到其他导出的types(即使我写入types的全名,即包含命名空间,它仍然看不到)。
  3. 所以我删除了Bar中的命名空间Ns ,当我用命名空间键入它的名字时,我可以看到其他types。 但是现在Bar是一个模块,我觉得像我的构造函数注入味道,因为Foo被导入,我可以直接实例化它。

我不想强迫我的标准。 我想知道我正在尝试做什么是正确的方法。 这个斗争让我觉得我有义务在开发nodejs应用程序时重新devise并使用完整的模块。 是对的吗?

如果我应该去完整的模块,我应该如何pipe理dependency injection?

谢谢

要充分利用面向对象的强大function(或者更好的说,基于接口的编程或面向协议的编程 ),你应该使用interface Foo来隐藏Bar类的具体实现MyFoo的使用。

Foo.ts

 export interface Foo { fooMethod(): number; } 

MyFoo.ts

 export class MyFoo { fooMethod(): number { return 1; } } 

Bar.ts

 import {Foo} from './Foo' export class Bar { constructor(private foo: Foo) {} barMethod(): number { return this.foo.fooMethod(); } } 

别的地方:

 import {Boo} from './Boo' import {MyFoo} from './MyFoo' const result = new Boo(new MyFoo()).barMethod(); 

我个人不build议使用命名空间。 您可以在这里阅读更多关于命名空间和模块的信息 。