Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Typescript中的闭包(依赖项注入)_Javascript_Dependency Injection_Functional Programming_Typescript - Fatal编程技术网

Javascript Typescript中的闭包(依赖项注入)

Javascript Typescript中的闭包(依赖项注入),javascript,dependency-injection,functional-programming,typescript,Javascript,Dependency Injection,Functional Programming,Typescript,我在尝试使用带有依赖项的函数式类型的TypeScript时被踢了屁股。假设我想制作一个依赖于另一个模块的模块 如果我没有使用依赖项注入,它会是这样的(在节点中) 这就是我使用依赖注入的方式 module.exports = function(SomeOtherModule) { function doSomething() { SomeOtherModule.blah() } return {doSomething: doSomething}; } 在typescript

我在尝试使用带有依赖项的函数式类型的TypeScript时被踢了屁股。假设我想制作一个依赖于另一个模块的模块

如果我没有使用依赖项注入,它会是这样的(在节点中)

这就是我使用依赖注入的方式

module.exports = function(SomeOtherModule) {
  function doSomething() {
    SomeOtherModule.blah()
  }

  return {doSomething: doSomething};
}
在typescript中,如果定义了具体的类或模块,则可以在导出函数或将其包含在类中时键入函数。挨着就行了

但是由于我不能在DI函数中定义一个模块,所以我能看到的唯一方法就是为我单独返回的对象定义一个接口,这很烦人,因为我想让类型注释与定义保持一致


有什么更好的方法可以做到这一点?

这可能会给你一个好的开始:


我不知道这是否是最好的设置方式。但我成功了。

我在项目中放弃了AMD,因为我也在使用AngularJS,他们互相攻击。我一直在使用相同的DI模式,所以最后看起来是这样的

我很满意。我用类来代替实验(如果你让你的模块保持无状态,并且让构造函数成为注入器函数,你可以非常接近),但是我不喜欢对所有依赖项都使用
这个

而且,类实际上并没有给我买任何东西,因为如果我对一个接口进行编码,我就必须定义两次类型

interface IMyService {
  doSomething();
}

module.exports = function(SomeOtherModule) {

  return {doSomething: doSomething}

  function doSomething() {
    SomeOtherModule.blah()
  }
}

是的,我可以让事情顺利进行,我只是对完成后的样子不满意。现在,我将只在顶部指定接口。
interface IMyService {
  doSomething();
}

module.exports = function(SomeOtherModule) {

  return {doSomething: doSomething}

  function doSomething() {
    SomeOtherModule.blah()
  }
}