You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Inversify自定义懒加载装饰器遇TS1239错误,求解决方案

错误原因与解决办法

错误原因

你定义的lazyLoading装饰器被标记为PropertyDecorator类型,仅适用于类属性,但你却将其用在了构造函数参数上。TypeScript对不同类型装饰器的参数要求完全不同:

  • 属性装饰器只接收2个参数:目标对象、属性名
  • 参数装饰器需要接收3个参数:目标类、构造函数名(此处为undefined)、参数索引

当你在构造函数参数上使用该装饰器时,TS会传入3个参数,但你的装饰器仅支持2个,因此触发TS1239类型错误。

即使使用inversify-binding-decorators的lazyInject,若装饰器类型不匹配或版本兼容问题,也会出现相同错误。


解决办法

方案1:修改自定义装饰器为参数装饰器

调整utils.ts中的实现,让装饰器适配参数装饰器的签名:

import { inject, LazyServiceIdentifier } from 'inversify';

// 返回参数装饰器类型,适配构造函数参数场景
export function lazyLoading<T>(serviceIdentifier: () => symbol): ParameterDecorator {
  return function (
    target: Object,
    propertyKey: string | symbol | undefined,
    parameterIndex: number
  ): void {
    // 创建懒加载服务标识
    const lazyId = new LazyServiceIdentifier<T>(serviceIdentifier);
    // 将懒加载标识绑定到目标参数
    inject(lazyId)(target, propertyKey, parameterIndex);
  };
}

在xy.ts中使用时,参数类型可保持原类型(Inversify会自动处理懒加载代理):

import { lazyLoading } from "../utils/util";

constructor(
  @lazyLoading(() => TYPES.OrchestratorService) 
  private _orchestratorService: OrchestratorService
) {
  this.orchestratorService = _orchestratorService;
}

方案2:使用Inversify官方lazyInject

直接使用Inversify内置的lazyInject装饰器(注意从inversify包导入,而非inversify-binding-decorators):

import { lazyInject } from 'inversify';

constructor(
  @lazyInject(() => TYPES.OrchestratorService) 
  private _orchestratorService: OrchestratorService
) {
  this.orchestratorService = _orchestratorService;
}

若仍报错,建议升级Inversify到与TS4.7.4兼容的稳定版本(如^6.0.1)。

方案3:改用属性装饰器(调整代码结构)

如果允许修改注入方式,将构造函数参数注入改为类属性注入,适配你原有的装饰器类型:

import { lazyLoading } from "../utils/util";
import { injectable } from 'inversify';

@injectable()
export class XY {
  @lazyLoading(() => TYPES.OrchestratorService)
  private orchestratorService!: OrchestratorService;

  constructor() {
    // 无需构造函数注入
  }
}

额外注意事项

  • 确保你的类已通过@injectable()装饰,否则Inversify无法处理依赖注入逻辑
  • 确认TYPES.OrchestratorService是正确的Symbol标识,且已在Inversify容器中完成对应服务的绑定

内容的提问来源于stack exchange,提问作者Swarup

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 15:23:27