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

2024-05-21

考虑一个函数:

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

我想要一个解析 foo 的装饰器,例如:

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

where @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 类型检查器相信装饰函数具有不同的签名。


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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

装饰器可以更改方法的签名吗? 的相关文章

随机推荐