如何使用Typescript和NodeJS将模块注入类中
How to inject a module into a class using Typescript and NodeJS
我在nodeJS+Typescript中进行开发。我有OO背景,我想从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)
当我试图像这样构建代码时,我面临的问题:
- Bar看不到Foo。我试图添加对该文件的引用,但没有成功
- 当我导入时,它"起作用"/foo,但当我这样做时,Bar在同一命名空间上定义的其他文件中看不到其他导出的类型(即使我写了类型的全名,即包含命名空间,它仍然看不到)
- 因此,我删除了Bar中的命名空间Ns,当我用命名空间键入它的名称时,我可以看到其他类型。但现在Bar是一个模块,我感觉我的构造函数注入有味道,因为Foo是导入的,我可以直接实例化它
我不想强求我的标准。我想知道什么是我正在尝试做的事情的正确方法。这种斗争让我觉得在开发nodejs应用程序时,我有义务重新设计并使用完整的模块。是这样吗?
如果我应该使用完整的模块,我应该如何管理依赖项注入?
感谢
要充分利用OOP(或者更好地说是基于接口的编程或面向协议的编程)的功能,您应该使用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();
就我个人而言,我不建议使用名称空间。您可以在这里阅读更多关于名称空间和模块的信息。
相关文章:
- 我可以像其他库一样将JointJS作为AngularJS模块注入吗
- 将模块注入控制器AngularJs
- AngularJS在不使用变量的情况下将服务注入模块中,这样就可以缩小它
- JavaScript模块化和依赖注入之间的区别
- JavaFX+Javascript:如何将Java对象注入AMD模块
- $injector:modulerr将自定义模块注入Angular应用程序
- angularjs自定义模块与$http注入
- 如何在angularjs中为每个控制器注入一个独特的模块
- 使用Angular JS将常量注入其他模块配置
- AngularJS 模块注入
- AngularJS选项卡导航和模块注入
- 角度 JS 模块注入错误
- 角度:需要从模块注入控制器
- 运行我的应用时,出现了Angular模块注入错误
- grunt-contrib- requires不能解析我的运行时模块注入
- 不能将一个应用模块注入另一个AngularJS
- 从外部模块注入提供程序到配置块时出现未知的提供程序错误
- 我可以动态地将一个模块注入另一个模块吗?
- 理解AngularJS模块注入逻辑
- 如何使用Typescript和NodeJS将模块注入类中