Многофункциональные сигнатуры Typescript в методе Decorator - PullRequest
0 голосов
/ 01 мая 2020

Я хочу, чтобы функции, которые я украшаю, были ограничены в своих типах аргументов. Это возможно для одной сигнатуры функции, так как она может быть передана в 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 здесь .

...