Зачем назначать другую функцию для descriptor.value при использовании декоратора машинописи - PullRequest
1 голос
/ 16 октября 2019

Я новичок в 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 новой функции, тогда вызывается новая функция, что несовместимо?

...