微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

JavaScript-Typescript:属性不存在

我正在尝试为Typescript中的REST Api接口开发装饰器.这是装饰器的实现

export function RemoteResource(params: any): Function {
    console.log("RemoteResource.params: ", params);
    return function (target: Function) {

        //--POST
        target.prototype.post = function () {
            console.log("----POST");
        };

        //--GET
        target.prototype.retrieve = function () {
            console.log("----GET");
        };

        //--DELETE
        target.prototype.remove = function () {
            console.log("----DELETE");
        };

        //--PULL
        target.prototype.update = function () {
            console.log("----PULL");
        };

        console.log("RemoteResource.target: ", target);

        return target;
    }
}

现在,我可以使用装饰器@RemoteResource并将post | retrieve | remove | update方法正确添加到原始对象原型中.

@RemoteResource({
    path: "/foos",
    methods: [],
    requireAuth: false
})
export class Foo { }

从这里开始,如果我执行

let tester = new Foo();
tester.post() //--This prints out "----POST" correctly

我已经正确打印了日志,但是我也遇到以下错误:“类型’Foo’中不存在属性’post’.”
虽然我理解为什么会有这个错误(Foo没有任何声明的post属性),但我不确定如何解决它.

理想情况下,我希望TS编译器了解装饰器扩展了原始对象,并添加了这些方法.

我该如何实现?有任何想法吗?

谢谢!

解决方法:

由于要在运行时在装饰器中动态添加这些方法,因此编译器无法知道这些方法将用于Foo实例.

您可以用不同的方式更改它,例如:

(1)使用接口和交集:

interface RemoteResource {
    post(): void;
    remove(): void;
    update(): void;
    retrieve(): void;
}

let tester = new Foo() as Foo & RemoteResource;
tester.post(); // no error

(2)接口和空方法

export class Foo implements RemoteResource {
    post: () => void;
    remove: () => void;
    update: () => void;
    retrieve: () => void;
}

let tester = new Foo() as Foo & RemoteResource;
tester.post();

编辑

@Robba建议:

(3)忽略所有类型检查

let tester = new Foo() as any;
tester.post();

要么

let tester = new Foo();
tester["post"]();

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐