使用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
相关产品推荐
相关产品推荐

