VSCode源码中@ICommentService是什么?接口为何能作装饰器
@ICommentService 是 VS Code 依赖注入体系中与ICommentService接口重名的装饰器常量,并不是直接用TypeScript接口做装饰器。
具体原理如下:
- TypeScript 接口仅存在于编译期,运行时会被完全擦除,确实无法直接作为运行时执行的装饰器使用,你提到的TypeScript官方文档的规则是完全正确的。
- VS Code 自研了一套依赖注入(DI)框架,框架约定所有服务都遵循「同名接口+同名装饰器」的定义规则:
- 先定义描述服务能力的
IXXXTypeScript 接口,用于编译期的类型校验 - 再通过框架提供的
createDecorator方法生成同名的IXXX装饰器常量,用于运行时标记依赖注入的服务标识
- 先定义描述服务能力的
- 因为 TypeScript 的类型命名空间和值命名空间是相互独立的,同名的接口和装饰器常量不会出现命名冲突,在类构造器参数中写
@ICommentService private commentService: ICommentService的写法时:- 装饰器位置的
@ICommentService用的是运行时存在的装饰器常量 - 类型标注位置的
ICommentService用的是编译期的接口类型
两者完全分开工作,你看到的「接口当装饰器」只是同名带来的视觉错觉而已。
- 装饰器位置的
通常这类服务的定义代码格式如下:
// 定义服务接口,仅用于编译期类型检查 export interface ICommentService { createCommentThread(...args: unknown[]): Promise<void>; // 其他接口方法定义 } // 生成同名装饰器常量,运行时实际使用的装饰器 export const ICommentService = createDecorator<ICommentService>('commentService');
内容的提问来源于stack exchange,提问作者miyamiya
相关产品推荐
相关产品推荐

