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

时间:2016-08-02 13:27:00

标签: javascript node.js typescript module

我正在开发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)

尝试构建代码时我遇到的问题:

  1. 看不到 Foo 。我试图添加对该文件的引用,但它没有用。
  2. 导入./foo时“工作”,但是当我这样做时 Bar 无法在同一命名空间中定义的其他文件中看到其他导出类型(即使我写了类型的全名,即包含命名空间,它仍然看不到它)。
  3. 所以我删除了 Bar 中的命名空间 Ns ,当我用命名空间键入其名称时,我可以看到其他类型。但是现在 Bar 是一个模块,我觉得我的构造函数注入气味,因为Foo是导入的,我可以直接实例化它。
  4. 我不想强迫我的标准。我想知道我正在尝试做什么的正确方法。这场斗争使我觉得在开发nodejs应用程序时我有义务重新设计并完成所有模块。是吗?

    如果我应该使用完整的模块,我应该如何管理依赖注入?

    谢谢

1 个答案:

答案 0 :(得分:1)

要充分利用 OOP (或更好地说Interface-based programming面向协议的编程)的强大功能,您应该使用interface Foo来隐藏使用MyFoo类的具体实施Bar

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();

我个人不建议使用命名空间。您可以阅读有关命名空间和模块here的更多信息。