我正在编写一个香草打字程序,如下所示
class DecoratorClass{
@HelloWorld
public property1:string="Siddu Rocks"
}
function HelloWorld(target:any,propertyName:string){
console.log("The Class Target and prop names are:"+target[propertyName] + "," +
propertyName)
}我得到了输出,因为类目标和道具名称是:未定义的,property1而不是类目标和道具名称是: Siddu,property1
为什么我要得到未定义的财产价值,这里有什么我遗漏的东西吗?我试过查看多个博客,但没有结果。
请帮帮我
发布于 2022-09-14 18:36:40
一个常见的误解是:装饰器中的target实际上不是类但是类原型本身的一个实例。
而且,转移的JavaScript实际上看起来像这样(即使在使用ESNext目标时也是这样):
class DecoratorClass {
constructor() {
this.property1 = "Siddu Rocks";
}
}这就是为什么当您尝试记录target[propertyName]时,会给出undefined。它不是在类上声明的,而是在创建类的实例时设置的。
在上面的链接中,也有以下说明:
属性描述符不作为属性装饰器的参数提供,因为属性装饰器是如何在TypeScript中初始化的。这是因为在定义原型成员时,目前没有描述实例属性的机制,也没有办法观察或修改属性的初始化程序。返回值也被忽略。因此,属性装饰器只能用于观察已为类声明了特定名称的属性。
本质上,类装饰器只能用于修改属性(用getter/setter替换,观察对其的更改,验证更改,等等)。
发布于 2022-09-14 18:34:51
属性装饰器正在修改类,而不是实例。因此,在调用property1时没有设置HelloWorld。
https://stackoverflow.com/questions/73721578
复制相似问题