无法将JavaScript注入模式转换为TypeScript

Unable to convert JavaScript injection pattern to TypeScript

本文关键字:转换 TypeScript 模式 注入 JavaScript      更新时间:2023-09-26

我们在一个相当大的普通JavaScript应用程序(更像是一个有许多消费者的框架)中使用定制的注入模式。该模式允许我们明确每个JS模块的依赖关系。这有两个主要的好处:在单元测试模块时很容易存根依赖,它允许我们的消费者在运行时动态地替换模块实现。

我们已经开始将所有模块迁移到TypeScript,但是在转换一些暴露自定义类型的模块时遇到了麻烦。问题是TypeScript似乎想要立即导出自定义类型,但实际上我们想要在通过函数调用(我们的依赖注入模式)提供运行时依赖后导出类型。

所以问题是我们如何在不影响模式本身的情况下将下面的注入模式转换为TypeScript ?

module.exports = function ContextModule(logger)  {
  var log = logger.register('context');
  function Context() {
    log('creating type');
  }
  Context.prototype = {
    doSomething: function() {
      log('doing something');
    }
  }
  Context.doSomethingStatic = function() {
    log('doing something static');
  }
  return Context;
};

返回自定义类型,然后可以在需要时创建它。例如,我们可以像这样在main.js中编写上述高度人为设计的模块:

var loggerModule = require('LoggerModule.js');
var contextModule = require('ContextModule.js');
logger = loggerModule();
var Context = contextModule(logger);
// then we might use the Context type
var context = new Context();
context.doSomething();       // instance method
Context.doSomethingStatic(); // static method

注意以下内容:

  • 记录器模块被注入到上下文模块
  • 记录器模块方法直接在ContextModule函数中使用,或者在它定义的"类"实现中使用。
  • 我们使用CommonJs来"require in"模块文件,并通过browserify来组合它们

所以问题是我们如何在不影响模式本身的情况下将下面的注入模式转换为TypeScript

你可以直接使用它(JavaScript是有效的TypeScript)。如果你想要安全,将注入框架转换为TypeScript习惯用法的过程将比使用专门为它设计的框架要困难得多。

我强烈推荐https://github.com/inversify/InversifyJS