Декоратор свойств Typescript - Нужна помощь, чтобы понять, как происходит следующее? - PullRequest
3 голосов
/ 27 апреля 2020

Я просто экспериментировал с декораторами свойств Typescript. Но я не мог понять поведение следующего кода:

function dec(hasRole: boolean) {
    return function (target: any, propertyName: string) {
        let val = target[propertyName];
        Object.defineProperty(target, propertyName, {
            get() { return val; },
            set(value) { val = hasRole; }
        });
    }
}

class Hey {
    age: number;

    @dec(true)
    hasRole: boolean = false;

    constructor(age: number) {
        this.age = age;
    }
}

let ob = new Hey(22);
console.log(ob);

// Фактический результат:

age: 22
hasRole: true
__proto__:
  constructor: class Hey
  hasRole: true
  get hasRole: ƒ get()
  set hasRole: ƒ set(value)
  __proto__: Object

Результат, который я ожидал, был: 1. OwnProperty -> hasRole = false 2. Свойство прототипа -> hasRole = true. В качестве 'target' в аргументе декоратора предоставляет функцию конструктора для stati c членов или прототипа класса для элементов экземпляра.

Может ли кто-нибудь объяснить мне эту функцию?

1 Ответ

2 голосов
/ 27 апреля 2020

Чтобы понять это ясно, вы должны взглянуть на версию

function dec(hasRole) {
    return function (target, propertyName) {
        let val = target[propertyName];
        Object.defineProperty(target, propertyName, {
            get() { return val; },
            set(value) { val = hasRole; }
        });
    };
}
class Hey {
    constructor(age) {
        this.hasRole = false;
        this.age = age;
    }
}
__decorate([
    dec(true)
], Hey.prototype, "hasRole", void 0);
let ob = new Hey(22);
console.log(ob);

Из приведенного выше кода должно быть ясно, что класс оформлен первым и только тогда создается новый экземпляр

Это означает, что во время выполнения конструктора hasRole уже определен в Prototype, следовательно, присвоение this.hasRole чему-либо не имеет никакого эффекта: это всегда присваивается параметру hasRole в декораторе (который true)

...