首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >nodejs DI容器awilix与类型安全的集成

nodejs DI容器awilix与类型安全的集成
EN

Stack Overflow用户
提问于 2020-08-17 16:58:48
回答 1查看 416关注 0票数 2

我正在考虑将DI容器集成到我现有的nodejs项目中。我已经集成了awilix,一切都像预期的那样工作。

然而,我习惯于在很多地方使用类型安全。这是我不能用awilix注册依赖项的一件事。

例如,我写了像高阶函数这样的用例

代码语言:javascript
运行
复制
function createReport(specs){

  const {reportRepostiory} = specs;

  return async (param1: string, param2: string){
    //...
    reportRepostiory.create({//some payload})
  }
  
}

调用函数调用如下所示

代码语言:javascript
运行
复制
const reportService : any = container.resolve("createReport");
const result = await reportService("1", "2")

上面的代码在适当的容器配置下工作得很好。但是,在解析的函数对象上没有类型推断。有没有办法获取类型?

EN

回答 1

Stack Overflow用户

发布于 2021-07-19 06:29:51

这不是我自己的原始答案,但我偶然发现了这个代码沙箱,它可能会对您有所帮助:https://codesandbox.io/s/qykt1?file=/src/index.ts

如果链接失效,下面是从上面的链接中提取的代码片段。

所有的荣誉都归功于作者derekrjones (https://codesandbox.io/u/derekrjones)。

代码语言:javascript
运行
复制
import {
  AwilixContainer,
  asFunction,
  asValue,
  asClass,
  InjectionMode,
  createContainer,
  Resolver,
  ResolveOptions,
  ContainerOptions
} from "awilix";

/**
 * Container definition base.
 */
interface ContainerDefinition {
  [key: string]: Resolver<unknown>;
}

/**
 * Extracts the type that will be resolved from a resolver.
 */
type ExtractResolverType<T> = T extends Resolver<infer X> ? X : null;

/**
 * Strongly-typed container.
 */
interface TypedAwilixContainer<T extends ContainerDefinition>
  extends Pick<AwilixContainer, Exclude<keyof AwilixContainer, "resolve">> {
  /**
   * Resolves the registration with the given name.
   *
   * @param  {string} name
   * The name of the registration to resolve.
   *
   * @return {*}
   * Whatever was resolved.
   */
  resolve<K extends keyof T>(
    key: K,
    resolveOptions?: ResolveOptions
  ): ExtractResolverType<T[K]>;
}

/**
 * Wraps `createContainer` and calls `register` on it.
 */
function createTypedContainer<T extends ContainerDefinition>(
  registrations: T,
  opts?: ContainerOptions
): TypedAwilixContainer<T> {
  return createContainer(opts).register(registrations) as any;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63447699

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档