装饰器可以更改方法的签名吗?

时间:2020-04-22 16:35:02

标签: typescript

考虑一个功能:

function handleFoo(foo: number){
    // ...
}

我想要一个可以解析f​​oo的装饰器,例如:

@fetchFromApi('/foo')
function handleFoo(foo: number){
    // ...
}

其中@fetchFromApi调用我的API,然后调用handleFoo并返回结果-此时,我希望不带参数地调用handleFoo,因为foo将会是fetchedFromApi。但是,TypeScript的类型检查器仍然希望我使用单个参数来调用handleFoo

是否可以更改装饰功能的签名?

我尝试调整装饰器的返回值,如下所示:

return function (target: Object, name: string | symbol, descriptor: any): TypedPropertyDescriptor<() => void> { ... }

但随后我得到:

Unable to resolve signature of method decorator when called as an expression.
    Type 'TypedPropertyDescriptor<() => void>' is not assignable to type 'TypedPropertyDescriptor<(foo: number) => void>'.

这对我来说很奇怪,感觉没有理由不起作用-装饰器是处理并返回函数的函数,对吗?在我看来,通过正确指定装饰器的返回类型,应该可以说服TS类型检查器装饰的函数具有不同的签名。

1 个答案:

答案 0 :(得分:0)

不,这是不可能的。如果您看到装饰器的基本结构,它实际上会采用函数(您希望将其修改为输入之一),然后添加其他步骤。因此,在这种情况下,您只能获得早期签名参数。