@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): error TS1238: Unable to resolve signature of class decorator when called as an expression. Type '(msg: string) => any' is not assignable to type 'void'.

但是genrated js执行得很好.我不知道为什么报告错误.

推荐答案

编译器希望你的装饰程序要么无效,要么返回一个与a兼容的值.它看到你返回一个(msg:any) => any,但不能得出这个函数与a兼容的结论.

如果您想消除错误,可以在返回ff时将其转换为任意值,或者甚至转换为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
}

也就是说,像这样替换类可能不是个好主意,至少应该维护构造函数:

TypeScript documentation:

注意:如果 Select 返回新的构造函数,则必须

Typescript相关问答推荐

无法访问Nextjs中的本地存储

类型可分配给类型的约束,但可以用不同的约束子类型实例化

具有映射返回类型的通用设置实用程序

如何使打包和拆包功能通用?

了解TS类型参数列表中的分配

typescribe警告,explate—deps,useEffect依赖项列表

为什么tsx不判断名称中有"—"的属性?'

为什么在这个例子中,我把缺少的属性添加到对象中时,TypeScrip没有拾取,如何修复?

带下拉菜单的Angular 响应式选项卡

为什么我的一个合成函数不能推断类型?

专用路由组件不能从挂钩推断类型

自动通用回调

使用或属性编写无限嵌套的接口

Angular NG8001错误.组件只能在一个页面上工作,而不是在她的页面上工作

如何将通用接口的键正确设置为接口的键

在REACT查询中获取未定义的isLoading态

如何使用angular15取消选中位于其他组件中的复选框

如何调整项目数组,但允许权重影响顺序

可以';t使用t正确地索引对象;联合;索引类型

Next 13 + React 18 createContext 类型的构建问题