首页 > 解决方案 > 键入一个类作为函数参数

问题描述

首先,这是核心接口:

// 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;
}

但我得到:

我迷路了:(..如何将实现我的接口的类定义为我的函数的参数? 注意:我的类的构造函数中的参数一直在变化,接口中函数的参数也是如此。

标签: typescripttypescastingnestjs

解决方案


今天我了解到可以特定的类键入装饰器。无论如何,我能够实现类似这样的东西:

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


推荐阅读