方法装饰器中的Typescript多功能签名

时间:2020-05-01 17:11:58

标签: typescript generics decorator function-signature

我希望装饰的函数的参数类型受到限制。对于一个函数签名来说,这是可行的,因为它可以传递到TypedPropertyDescriptor<T>中。但是对于多个,如果省略了参数,则失败Type '({ abc }: { abc: string; }, context: any) => string' is not assignable to type 'Signature<{ abc: any; }>'。 这是我想出的代码:

class Test {
  // works
  @Decorator('abc')
  test0(): string {
    return '';
  }

  // fails
  @Decorator('abc')
  test1({abc}: {abc: string}): string {
    return '';
  }

  // fails
  @Decorator('abc')
  test2({abc}: {abc: string}, context: any): string {
    return '';
  }
}

interface Signature<T> extends Function {
  (args: T, context: any): any;
  (args: T): any;
  (): any;
}

function Decorator<T>(...args: Array<keyof T>) {
  return function (target: any, key: string, descriptor: TypedPropertyDescriptor<Signature<T>>) {
    // do something
  }
}

现在,关于类,这不是问题。方法实现可以忽略参数。这很令人困惑。

我注意到,将参数标记为可选作品,但随后我必须做多余的空检查才能正确键入。

您可以找到一个REPL here

0 个答案:

没有答案
相关问题