Я новичок в Typescript и действительно путаюсь с использованием декоратора. Я видел код, показанный ниже:
function log(target: any, key: string, descriptor: any) {
const original = descriptor.value;
descriptor.value = function (...args: any[]) {
// Call the original method
const result = original.apply(this, args);
// Log the call, and the result
console.log(`${key} with args ${JSON.stringify(args)} returned ${JSON.stringify(result)}`);
// Return the result
return result;
}
return descriptor;
}
class Calculator {
// Using the decorator
@log
square(num: number) {
return num * num;
}
}
const calculator = new Calculator();
// square with args [2] returned 4
calculator.square(2);
ниже мои вопросы:
Q1 - я понимаю, что descriptor.value
содержит оригинальный метод square
, затем назначается другая анонимная функцияdescriptor.value
, затем верните descriptor
, я не уверен, что именно это означает, но я предполагаю, что будет вызываться новая функция, содержащаяся descriptor.value
, но кем? кто вызовет функцию журнала декоратора и получит возвращенный descriptor
и вызовет функцию его значения? / Кто будет вызывать функцию log
?
Q2 - почему новая назначенная анонимная функция принимает массив параметров, не правда ли, что одного параметра достаточно, как показано ниже:
...
descriptor.value = function (args: any) {
...
}
Q3 - Если я не назначу другую функцию для descriptor.value
как:
function log(target: any, key: string, descriptor: any) {
const original = descriptor.value; //does nothing
return descriptor;
}
Я полагаюsquare
метод будет вызван дважды, но он будет вызван только один раз. Так почему же, когда вы присваиваете descriptor.value
новой функции, тогда вызывается новая функция, что несовместимо?