如何使用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)
尝试像这样构造代码时遇到的问题:
- 酒吧看不到Foo 。 我试图添加一个对该文件的引用,但没有奏效。
- 当我导入./foo时,它“工作”,但是当我这样做时, Bar在同一个命名空间中定义的其他文件中看不到其他导出的types(即使我写入types的全名,即包含命名空间,它仍然看不到)。
- 所以我删除了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议使用命名空间。 您可以在这里阅读更多关于命名空间和模块的信息 。