gpt4 book ai didi

javascript - 如何使用装饰器扩展类类型

转载 作者:行者123 更新时间:2023-12-04 15:00:17 24 4
gpt4 key购买 nike

我想在我的项目中使用装饰器。这是我写的:

export const DetachedWindow = (options: TDetachedWindowOptions = defaultOptions) => <R extends Constructable>(Clazz: R): R => {
const tmp = class extends Clazz {
value = 'value';

value2 = 'value2';

constructor(...args: any[]) {
super(...args);
// <some logick>
}
};
Object.defineProperty(tmp, 'name', { value: Clazz.name });
return tmp;
};

如您所见,这个装饰器创建了一些字段。但是 typescript 无法识别它们

@DetachedWindow({ optA: 'optA' })
export class SomeClass {
constructor() {
setTimeout(() => {
console.log(this.value); // TS2339: Property 'value' does not exist on type 'SomeClass'.
});
}
}

它确实存在。如果我在使用这些参数之前添加 @ts-ignore,代码可以正常工作。

我很受伤,我怎样才能创建一个类装饰器,它会扩展父类的类型。我试图做这样的事情:

export const DetachedWindow = (options: TDetachedWindowOptions = defaultOptions) => <R extends Constructable>(Clazz: R): R & { value: string } => {

但这并没有帮助。

有什么想法吗?

最佳答案

答案在 Class decorators 的 TypeScript 文档中:

// Note that the decorator _does not_ change the TypeScript type
// and so the new property `reportingURL` is not known
// to the type system:
bug.reportingURL;
Property 'reportingURL' does not exist on type 'BugReport'.

关于javascript - 如何使用装饰器扩展类类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67057250/

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