Дескриптор свойства установлен в enumerable: false, доступный для записи: true в классе - PullRequest
0 голосов
/ 25 октября 2018

Я хотел бы скрыть член somme в цикле for in в javascript / typescript с дескриптором

const defaultDescriptor = {
    configurable: true,
    enumerable: false,
    writable: true
}

Более важно, я хотел бы применить этот дескриптор к члену класса, чтобыкаждый экземпляр этого класса наследуется от дескриптора для этого члена.

Я пробовал это:

"use strict";

class Test1 {
    test1 = 1;
}

Object.defineProperty(Object.getPrototypeOf(Test1), "test1", defaultDescriptor);
Object.defineProperty(Test1.constructor, "test1", defaultDescriptor);
Object.defineProperty(Test1, "test1", defaultDescriptor);

const t = new Test1();
console.log(Object.keys(t)); // expected [], received [ "test1" ]

детская площадка

Но свойство test1 все еще перечислим.

Я тоже пробовал это

"use strict";

function notEnumerable(target: any, propertyKey: string) {
    let descriptor = Object.getOwnPropertyDescriptor(target, propertyKey) || defaultDescriptor;
    descriptor.enumerable = false;
    Object.defineProperty(target, propertyKey, descriptor)
}

class Test2 {
    @notEnumerable
    test2 = 2
}

const t = new Test2();
console.log(Object.keys(t)); // expected [], received [ "test2" ]

детская площадка

Эта вторая попытка вдохновлена ​​ этим ответом , но ответ для меня неверный (всплывающая ошибка с "use strict", потому что по умолчанию для записи указано значение false).

Обратите внимание, что если я заменю defaultDescriptor на {}, то член test2 не перечислимо, но также не доступно для записи.

Знаете ли вы способ объявить член доступным для записи и не перечисляемым на уровне класса (в отличие от уровня экземпляра, в этом случае все работаетхорошо)?

...