gpt4 book ai didi

javascript - 为什么可枚举 : false not cascade to inherited classes in TypeScript?

转载 作者:行者123 更新时间:2023-11-30 20:23:32 24 4
gpt4 key购买 nike

如果我使用 TypeScript 和下面的方法将属性标记为 @enumerable(false),则扩展父类的子类(其中此可枚举项被标记为 false)将具有该属性,但它将可枚举取自this answer .

export {}

declare global {
function enumerable(value: boolean): any;
}

const _global = (global /* node */ || window /* browser */) as any;

/**
* @enumerable decorator that sets the enumerable property of a class field to false.
* @param value true|false
*/
_global.enumerable = function(value: boolean): any {
return function (target: any, propertyKey: string) {
let descriptor = Object.getOwnPropertyDescriptor(target, propertyKey) || {};
if (descriptor.enumerable != value) {
descriptor.configurable = true;
descriptor.writable = true;
descriptor.enumerable = value;
Object.defineProperty(target, propertyKey, descriptor)
}
};
}

这是我的层次结构:

class BaseObject {
@enumerable(false)
public _metadata: any = {
id: 'number',
name: 'string'
};
}

class ContainerObject extends BaseObject {
// ...
}

class CanvasObject extends BaseObject {
// ...
}

下面是描述符在运行时的值:

var canvas = new CanvasObject();
console.log('Metadata Descriptor: ');
console.log(Object.getOwnPropertyDescriptor(canvas, '_metadata'));
Metadata Descriptor:
{ value:
{ beanId: 'number',
name: 'string' },
writable: true,
enumerable: true,
configurable: true }

如何确保此属性在父类和所有后续继承类中都是enumerable: false

最佳答案

这是由于在类声明中将装饰器应用于类原型(prototype)造成的。由于 _metadata 是实例属性(它被分解为 constructor() { this._metadata = ... }),enumerable 装饰器不影响

下面是一个可枚举装饰器的例子,它可以应用于原型(prototype)(通常是方法)和实例属性:

function enumerable(value: boolean) {
return (target: any, prop: string, descriptor?: PropertyDescriptor) => {
if (descriptor) {
// prototype property
descriptor.enumerable = value;
} else {
// instance property
let propSymbol = Symbol(prop);

Object.defineProperty(target, prop, {
configurable: true,
enumerable: value,
get() { return this[propSymbol] },
set(value) { this[propSymbol] = value }
});
}
};
}

请注意,为了处理 _metadata = ... 属性初始值设定项,描述符应包含 set 访问器以捕获属性分配。

关于javascript - 为什么可枚举 : false not cascade to inherited classes in TypeScript?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51197287/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com