typescript - 键入一个类作为函数参数
问题描述
首先,这是核心接口:
// IMySuperInterface.interface.ts
export interface IMySuperInterface<T = any> {
handle(arg?: any): Promise<T>;
}
基本上,我只需要一个带有“句柄”功能的 ==> 子类的通用类型。就像是 :
function MyDummyFunction (param: {{class that extends IMySuperInterface)}})
我尝试在我的应用程序中注册所有实现我的“IMySyperInterface”的类
// MySuperImplementation.service.ts
@Feature('ReferenceA')
export class MySuperImplementation
implements IMySuperInterface {
constructor(private readonly logger: myLoggerService) {
this.logger.setContext(this);
}
async handle(someDummy: any): Promise<void> {
....
}
}
这里是装饰器的定义
// feature.decorator.ts
const _mapping = new Map<string, anyOrIdontKnowWhatToDo>();
export function Feature(key: string) {
return function (target: **HERE WHAT CAN I WRITE ??????**) {
Feature.cache.set(key, target);
return target;
};
}
我尝试找到某种'AtLeastContains<IMySuperInterface>'或 Type<IMySuperInterface>
和
export interface Type<T = any> extends Function {
new (...args: any[]): T;
}
但我得到:
- 两者都不是:抱歉,IMySuperInterface 中缺少“原型”
- 两者都不是:对不起,但记录器与“类型”类型不兼容
我迷路了:(..如何将实现我的接口的类定义为我的函数的参数? 注意:我的类的构造函数中的参数一直在变化,接口中函数的参数也是如此。
解决方案
今天我了解到可以为特定的类键入装饰器。无论如何,我能够实现类似这样的东西:
export function Command(
options: CommandMetadata,
): <TFunction extends CommandRunner>(target: TFunction) => void | TFunction {
return (target) => {
Reflect.defineMetadata(CommandMeta, options, target);
return target;
};
}
这是一个完全类型化的装饰器,而不是使用ClassDecorator
类型,以便我可以target
正确设置 的泛型类型。应该大致是你要找的。只需用您的界面替换并用装饰器的逻辑CommandRunner
返回 anon函数即可。target
推荐阅读
- php - PHP如何计算数组中的“subINT”
- android - 访问整个 Xamarin 应用程序的文件夹
- c - 摆脱 IAR 编译警告 Pa039 ?“使用未对齐结构成员的地址”
- azure - 如何通过电子邮件发送来自 Azure Blob 的文件内容
- vba - 如何修复 Excel-2016 未运行 Excel-2010 VBA 代码以正确打印?
- windows - 如何在正在运行的进程上批处理或 cli 自动化 sigcheck.exe?
- c# - 覆盖 asp 网络表单操作
- python - python OOP 类方法保留变量。奇怪的范围界定
- html - 滚动时带有子菜单下拉的水平 CSS 菜单未对齐
- javascript - 在滚动时,“粘性元素”需要在“页脚区域”之前而不是在页面底部