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