在类

时间:2018-10-25 14:34:57

标签: typescript properties descriptor

我想使用描述符

将somme成员隐藏在javascript / typescript中的for in循环中
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" ]

playground

但是属性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" ]

playground

第二次尝试的灵感来自this answer,但是答案对我来说是不正确的("use strict"会弹出错误,因为默认情况下writable为false)。

请注意,如果我将defaultDescriptor替换为{},则成员test2不可枚举,但也不可写。

您知道一种将成员声明为可写且在类级别不可枚举的方法(通过反对实例级别,在这种情况下一切正常)吗?

0 个答案:

没有答案