考虑一个功能:
function handleFoo(foo: number){
// ...
}
我想要一个可以解析foo的装饰器,例如:
@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类型检查器装饰的函数具有不同的签名。
答案 0 :(得分:0)
不,这是不可能的。如果您看到装饰器的基本结构,它实际上会采用函数(您希望将其修改为输入之一),然后添加其他步骤。因此,在这种情况下,您只能获得早期签名参数。