gpt4 book ai didi

TypeScript - 相互依赖的装饰器

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

来自 TypeScript docs

As such, the following steps are performed when evaluating multiple decorators on a single declaration in TypeScript:

  1. The expressions for each decorator are evaluated top-to-bottom. The
  2. results are then called as functions from bottom-to-top.

问题

我有两个装饰器,其中一个装饰器依赖于另一个:

示例

@test()
@testCase({...})
public doSomething(): void {
}

@testCase() 依赖于 @test() 因为测试需要添加到测试运行器,然后才能将测试用例添加到测试。

我可以...

@testCase({...})
@test()
public doSomething(): void {
}

但是在声明某个东西是测试之前声明测试用例似乎很奇怪。

有没有办法让装饰器相互依赖,即 testCase 必须在 test 之后?

最佳答案

您可以在testcase 中向目标函数添加额外信息,然后在test 装饰器中检查额外信息。额外信息下方是一个回调,更多的装饰者可以参与其中。这提供了很大的灵 active ,但您可以添加其他信息而不是回调,并在 test 装饰器中使用该信息。

interface IAfterTestRegistered {
afterTestRegisteredCallback?: ()=> void
}
// We could potentially have more then one contributor that need a callback executed.
function addCallback(obj: IAfterTestRegistered, callback : () => void) {
let oldCallback = obj.afterTestRegisteredCallback;
if(oldCallback != undefined) {
obj.afterTestRegisteredCallback = () =>{
oldCallback();
callback();
}
}
else{
obj.afterTestRegisteredCallback = callback;
}
}

function test() : MethodDecorator {
return function<T>(target: Object, propertyKey: string | symbol, descriptor: TypedPropertyDescriptor<T>) : void {
console.log("test");
let targetFunction: IAfterTestRegistered = target[propertyKey];
if(targetFunction.afterTestRegisteredCallback) {
targetFunction.afterTestRegisteredCallback();
}
}
}

function testCase(data: { index: number}) : MethodDecorator {
return function<T>(target: Object, propertyKey: string | symbol, descriptor: TypedPropertyDescriptor<T>) : void {
console.log(`testcase ${data.index}`);
addCallback(target[propertyKey], () =>
{
console.log(`after-register testcase ${data.index}`);
});
}
}

class myClass {
@test()
@testCase({ index: 1 })
@testCase({ index: 2 })
public doSomething(): void {
}
}
// Will output
// testcase 2
// testcase 1
// test
// after-register testcase 2
// after-register testcase 1

关于TypeScript - 相互依赖的装饰器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49630739/

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