有没有办法使用 TypeScript 装饰器更改返回值?

Is there a way to change the return value with a TypeScript decorator?

提问人:goodkat 提问时间:10/17/2022 最后编辑:Peter Mortensengoodkat 更新时间:12/31/2022 访问量:137

问:

我正在尝试改变各种方法的行为。该行为包括检查发送的参数中是否存在值,并在该方法返回的值上设置属性。

例:

function ParseDiscounts {
    return function (
        target: any,
        propertyKey: string,
        descriptor: PropertyDescriptor,
    ) {
        const originalMethod = descriptor.value;
        descriptor.value = async function (...args: any[]) {
            if(args[0].discounts !== undefined) {
                /**
                 *
                 * here is where supposed to add a property on the return
                 * something like resultToBeParsed.isDiscountApplied = true
                 *
                 * */
            }
            const result = await originalMethod.apply(this, args);
            return result;
        };
        return descriptor;
    };
}

class Order {
    @ParseDiscounts()
    createOrder(discountPayload) {
        /**
         * Do everything that it is supposed to do while only at the return of the function
         * the `isDiscountApplied = true` is added to the result through the decorator
         * */
        return resultToBeParsed
    }
}

const firstOrder = new Order()
const firstResult = firstOrder.createOrder({ otherProperties: 'blah, blah, blah', discounts: [1,2,3]})
// firstResult.isDiscountApplied = true

const secondOrder = new Order()
const secondResult = secondOrder.createOrder({ otherProperties: 'blah, blah, blah'})
// secondResult.isDiscountApplied = false

当有任何折扣 whithin discountPayload 时,我希望添加一个属性resultToBeParsedisDiscountApplied = false (e.g.)

我知道我可以做一些事情,比如创建一个 whithin 装饰器并分配结果 whithin,但我也想操纵方法返回周期(我什至不知道这是否可能)。parsedResponse

我不知道这是否是最好的方法,真的,如果你们知道更好的东西,我会很高兴听到......我这样做是因为有很多地方我会使用它。

TypeScript 方法 返回 装饰器

评论

1赞 katniss 10/17/2022
修饰器无法更改其目标的类型。但是,您始终可以自己显式注释它们。
0赞 goodkat 10/17/2022
我是这么认为的......你知道有什么工具可以很容易地实现这样的事情吗?
0赞 jcalz 10/17/2022
您是否保持类型相同,但只是更改?还是您正在更改类型?很高兴在这里看到一个最小的可重现示例,您可以在其中实际发生一些事情,而不是“做它应该做的一切”和“检查{discountPayload}中是否有任何折扣”,因此我提出的任何解决方案都可以针对常见示例进行测试
1赞 jcalz 10/17/2022
例如,这种方法展示了如何使用装饰器来包装方法,以便在不更改类型的情况下更改返回。如果您需要更改类型,那么这是问题中应该包含的重要信息。
0赞 jcalz 10/17/2022
这种方法可以解决不断变化的返回类型,但你必须放弃装饰器才能做到这一点。让我知道您希望如何进行这里,或者如果这些都不能满足您的需求(请在评论中提及@jcalz以通知我)。祝你好运!

答: 暂无答案