Если я отмечу свойство как @enumerable(false)
с использованием TypeScript и описанного ниже метода, дочерние классы, расширяющие родительский класс, для которого это перечисляемое значение помечено как ложное, будут иметь свойство, но оно будет перечислимо, принимая этого ответа .
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
в родительском классе и всех последующих унаследованных классах?