Метод декораторской печати - PullRequest
0 голосов
/ 26 сентября 2019

Я пытаюсь реализовать декоратор метода , который добавляет регистрацию к сетевому запросу, но у меня возникают некоторые проблемы с компиляцией.

Я реализовал функцию logкоторый вручную копирует типы из MethodDecorator для создания универсальной функции, где T - это максимально широкое определение функции.Ведение журнала является суперосновным (только некоторые console.log s, основанные на выполнении значения).Это используется в качестве @log декоратора в образце NetworkClient#makeRequest метода:

const log = <T extends (...args: any[]) => any>(
  target: Object,
  propertyKey: string | symbol,
  descriptor: TypedPropertyDescriptor<T>
) => {
  if (descriptor.value && typeof descriptor.value === 'function') {
    const logIdentifier = String(propertyKey);
    const originalValue = descriptor.value;

    descriptor.value = (...args: any[]): any => {
      console.log(`Start: ${logIdentifier}`);

      try {
        const returnValue = originalValue(...args);

        return returnValue instanceof Promise
          ? returnValue
              .then(response => {
                console.log(`Resolved: ${logIdentifier}`);
                return response;
              })
              .catch(error => {
                console.log(`Rejected: ${logIdentifier}`);
                throw error;
              })
          : returnValue;
      } catch (error) {
        console.log(`Error: ${logIdentifier}`);
        throw error;
      }
    };
  }
};

interface NetworkClientOptions {
  url: string;
}

class NetworkClient {
  private _options: NetworkClientOptions;
  private constructor(options: NetworkClientOptions) {
    this._options = options;
  }
  static create(options: NetworkClientOptions) {
    return new NetworkClient(options);
  }

  @log
  async makeRequest() {
    return this._options.url;
  }
}

(async () => {
  const networkClient = NetworkClient.create({ url: 'http://google.com/' });
  await networkClient.makeRequest();
})();

Вот ошибка:

$ yarn --silent tsc
fancy-decorators.ts:10:5 - error TS2322: Type '(...args: any[]) => any' is not assignable to type 'T'.
  '(...args: any[]) => any' is assignable to the constraint of type 'T', but 'T' could be instantiated with a different subtype of constraint '(...args: any[]) => any'.

10     descriptor.value = (...args: any[]): any => {
       ~~~~~~~~~~~~~~~~


Found 1 error.

error Command failed with exit code 2.

Эти самые широкие возможные типы функций идентичны, поэтомуэта ошибка не имеет смысла для меня.Я искал проблемы с Microsoft / TypeScript и, похоже, не нашел ничего подходящего.Жук?Есть мысли?

Соответствует envinfo:

    Shell: 3.2.57 - /bin/bash
    Node: 10.16.3 - ~/.nvm/versions/node/v10.16.3/bin/node
    Yarn: 1.17.3 - ~/.nvm/versions/node/v10.16.3/bin/yarn
    npm: 6.9.0 - ~/.nvm/versions/node/v10.16.3/bin/npm
    typescript@3.6.3
...