【问题标题】:Typescript: Property does not exist打字稿:属性不存在
【发布时间】:2016-11-10 12:27:54
【问题描述】:

我正在尝试为 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

我的日志打印正确,但我也有以下错误:“属性 'post' 在类型 'Foo' 上不存在。” 虽然我了解为什么会出现此错误(Foo 没有任何声明的 post 属性),但我不确定如何修复它。

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

我怎样才能实现它?有什么想法吗?

谢谢!

【问题讨论】:

标签: javascript typescript decorator


【解决方案1】:

由于您是在运行时在装饰器中动态添加这些方法,编译器无法知道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"]();

【讨论】:

  • 感谢您的回答。最后,我将装饰器重新设计成一个接口,然后使用一个类来实现它。
猜你喜欢
  • 2017-03-02
  • 2021-09-07
  • 2015-12-26
  • 2021-02-19
  • 2018-02-05
  • 2017-08-07
  • 2017-03-26
  • 2017-09-06
  • 2020-05-21
相关资源
最近更新 更多