使用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读取不到这两个配置,自然不支持参数装饰器的语法。
修复步骤
- 调整tsconfig.json的结构,把这两个配置移到
compilerOptions里面,修正后的完整配置:
{ "compilerOptions": { "target": "ES2020", "useDefineForClassFields": false, "experimentalDecorators": true, "emitDecoratorMetadata": true } }
- 保存配置后,重启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
相关产品推荐
相关产品推荐

