繁体   English   中英

TypeScript 装饰器报告“作为表达式调用时无法解析 class 装饰器的签名”

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM