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

使用TSyringe实现DI时参数装饰器报错Decorators are not valid here.ts(1206)

使用TSyringe时参数装饰器报错"Decorators are not valid here.ts(1206)"的解决方案

问题情况

在项目中用TSyringe实现依赖注入,因为用到接口,需要在构造函数参数上用@inject("Controller")装饰器关联接口和实现类,但一直弹出"Decorators are not valid here.ts(1206)"错误。奇怪的是类上的@injectable()装饰器完全正常。

构造器代码:

public constructor(@inject("Controller") private _controller: Controller) { }

之前已经试过把tsconfig.json里的experimentalDecorators、emitDecoratorMetadata设为true,useDefineForClassFields设为false,但问题没解决,当前的tsconfig配置是这样的:

{ 
  "compilerOptions": { 
    "target": "ES2020", 
    "useDefineForClassFields": false, 
  } 
  "experimentalDecorators": true,  
  "emitDecoratorMetadata": true  
}

问题根源

你的tsconfig配置写错了——experimentalDecorators和emitDecoratorMetadata这两个关键配置没有放在compilerOptions对象内部,而是直接挂在了配置文件的根节点。TypeScript读取不到这两个配置,自然不支持参数装饰器的语法。

修复步骤

  1. 调整tsconfig.json的结构,把这两个配置移到compilerOptions里面,修正后的完整配置:
{
  "compilerOptions": {
    "target": "ES2020",
    "useDefineForClassFields": false,
    "experimentalDecorators": true,
    "emitDecoratorMetadata": true
  }
}
  1. 保存配置后,重启TypeScript语言服务(比如VS Code里按Ctrl+Shift+P,输入TypeScript: Restart TS Server执行),让新配置生效。

验证示例

配置修正后,参数装饰器就能正常工作了,这里给个完整的可运行示例参考:

import { injectable, inject, container } from "tsyringe";

// 定义接口
interface Controller {
  handle(): void;
}

// 实现类标记为可注入
@injectable()
class ControllerImpl implements Controller {
  handle() {
    console.log("处理请求");
  }
}

// 注册接口与实现类的映射
container.register("Controller", { useClass: ControllerImpl });

// 依赖注入的业务类
@injectable()
class Service {
  constructor(@inject("Controller") private _controller: Controller) {}

  doWork() {
    this._controller.handle();
  }
}

// 获取实例并调用
const service = container.resolve(Service);
service.doWork(); // 输出:处理请求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 13:07:08