[英]Typescript error “Unable to resolve signature of class decorator when called as an expression” in Vuex module
[英]TypeScript decorator reports "Unable to resolve signature of class decorator when called as an expression"
@xxx("xxx")
class A{
msg:string
constructor(msg:string) {
this.msg = msg
}
print() {
console.log(this.msg)
}
}
function xxx(arg:string) {
function f(target) {
function ff(msg: string) {
return new target(arg + ":" + msg)
}
return ff
}
return f
}
let a = new A("hellow")
a.print()
编译时,它报告:
decorator.ts(1,1):错误 TS1238:当作为表达式调用时,无法解析 class 装饰器的签名。 类型“(msg: string) => any”不可分配给类型“void”。
但是生成的js执行得很好。 不知道为什么会报错。
编译器希望您的装饰器为 void 或返回与 A 兼容的值。它看到您返回(msg:any) => any
但不能得出此函数与 A 兼容的结论。
如果您想摆脱错误,您可以在返回时将 ff 强制转换为 any ,或者甚至可以将其强制转换为typeof A
以更清晰地传达意图:
function xxx(arg: string)
{
function f(target)
{
function ff(msg: string)
{
return new target(arg + ":" + msg)
}
return <typeof A><any>ff
}
return f
}
也就是说,替换这样的类可能不是一个好主意,您至少应该维护构造函数:
注意 如果您选择返回一个新的构造函数,您必须注意维护原始原型。 在运行时应用装饰器的逻辑不会为您执行此操作。
这似乎可以通过在 tsconfig.json 中添加 ES2016 或 ES5 作为目标来解决
https://github.com/alsatian-test/alsatian/issues/344#issuecomment-290418311
正如上面 Alex 所提到的,编译器希望您的装饰器为 void 或返回与 A 兼容的值。因此您可以将 ff 强制转换为typeof target
。
function xxx(arg:string) {
function f(target) {
function ff(msg: string) {
return new target(arg + ":" + msg)
}
return ff as typeof target
}
return f
}
对于 2022 年一定遇到过这个问题的任何人。我花了很长时间,但我意识到我正在使用箭头功能。 装饰器不适用于箭头功能。 当我改变它时,它工作得很顺利。
我的问题是我的 tsconfig.json 的compilerOptions
中仍然有"experimentalDecorators": true
,但在最新版本的 TypeScript 中不再需要了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.