我只是想分享一下与 TypeScript 装饰器的短暂斗争的结果。
我试图从属性装饰器中更改属性描述符,例如为了使属性可编号:
export function MyPropDecorator<T>(options: {enumerable: boolean, <other options...> }) {
return function (target: any, key: string): any {
let type = Reflect.getMetadata("design:type", target, key);
let pd = Object.getOwnPropertyDescriptor(target, key);
pd.enumerbale = options.enumerable;
Object.defineProperty(target, key, pd);
...
}
}
但是一旦离开装饰器功能,“eumerable”就以某种方式变回了“false”。问题是不能在属性装饰器中调用“Object.defineProperty”,因为 TypeScript 的“__decorate”函数会覆盖它。 诀窍是返回修改后的属性描述符:
export function MyPropDecorator<T>(options: {enumerable: boolean, <other options...> }) {
return function (target: any, key: string): any {
let type = Reflect.getMetadata("design:type", target, key);
let pd = Object.getOwnPropertyDescriptor(target, key);
pd.enumerbale = options.enumerable;
return pd;
}
}