gpt4 book ai didi

typescript - 如何将实例变量传递给 typescript 装饰器参数?

转载 作者:搜寻专家 更新时间:2023-10-30 20:32:12 26 4
gpt4 key购买 nike

How to implement a typescript decorator?是关于如何在 typescript 中使用装饰器的一个很好的例子。

考虑到以下情况,

class MyClass {
@enumerable(false)
get prop() {
return true;
}

@property({required: true}) //here pass constant is no issue
public startDateString:string;

@property({afterDate: this.startDateString}) //how to pass startDateString here?
public endDateString:string;
}

function enumerable(isEnumerable: boolean) {
return (target: Object, propertyKey: string, descriptor: TypedPropertyDescriptor<any>) => {
descriptor.enumerable = isEnumerable;
return descriptor;
};
}

我尝试了所有方法,但似乎无法将 startDateString 传递给装饰器参数。 startDateString 可以是变量、函数和引用。

最佳答案

你想做的事是不可能的。

装饰器在声明类时被调用,此时没有实例传递给装饰器。

例如,使用此代码:

class MyClass {
startDateString: string;
@property({ afterDate: this.startDateString })
endDateString: string;
}
let myClass = new MyClass();
  1. MyClass 已声明。
  2. 装饰器在 MyClass 上运行。此时不存在可传入的实例,装饰器参数中的 this 指的是全局对象,而不是实例。
  3. new MyClass() 被调用并创建实例。这一步不调用装饰器。那已经发生了。

查看编译后的 JavaScript 以供引用:

var MyClass = (function () {
// -- 1 --
function MyClass() {
}
// -- 2 --
__decorate([
// see here... `this` is equal to the global object
property({ afterDate: this.startDateString })
], MyClass.prototype, "endDateString", void 0);
return MyClass;
})();
// -- 3 --
var myClass = new MyClass();

请注意,使用 this.startDateString 不会在此处引发编译错误,因为 this 的类型为 any

因此,这里试图通过传入实例属性来完成的操作没有意义,也不可能。

你可以做的是使 startDateString 静态然后像这样传递它:@property({ afterDate: MyClass.startDateString })

关于typescript - 如何将实例变量传递给 typescript 装饰器参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34756294/

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