Typescript找不到超类的类型定义中定义的方法。怎么了?

时间:2018-07-16 23:38:46

标签: typescript inheritance typescript-typings

我正在使用JointJS,它带有定义的类型。在那里,我有一个Typescript类定义如下:

namespace joint {
    namespace shapes {
        namespace devs {
            class Model extends basic.Generic { ... }
        }
    }
}

namespace basic {
    class Generic extends dia.Element { ... }
}

namespace dia {
    class Element extends Cell { ... }
    class Cell extends Backbone.Model { ... }
}

namespace Backbone {
    class Model extends ModelBase {
    ...
    defaults(): ObjectHash;
}

因此,最终,joint.shapes.devs.Model应该具有从Generic <- dia.Element <- dia.Cell <- Backbone.Model继承的defaults属性

但是,当我尝试扩展该对象时:

const extendedModel = joint.shapes.devs.Model.extend(
    ...
), joint.shapes.devs.Model.defaults);

...打字稿说joint.shapes.devs.Model没有定义此属性:

error TS2339: Property 'defaults' does not exist on type 'typeof Model'.

我尝试调用方法而不是仅调用属性:

const extendedModel = joint.shapes.devs.Model.extend(
    ...
), joint.shapes.devs.Model.defaults());

但是我得到了相同的消息。

我正在使用打字稿2.7.2

我的问题是:这是怎么了?我该如何解决?

谢谢!

1 个答案:

答案 0 :(得分:0)

在您尝试声明的状态下,defaults属性不属于Model类型,而是存在于Model实例上,即存在于new Model创建的对象上。没有实例,它们就毫无意义。

那么,让我们看一下extend()方法的定义:

public static extend(properties: any, classProperties?: any): any;

因此,您正在将此变量作为classProperties传递。该参数似乎反映了静态属性,即您可以通过extendedModel.propName访问的属性。如果您不打算使用此语法,则可以将此参数留空,因为它是可选的。

最后,如果您熟悉ES6类,则似乎建议使用它们(通过定义中的注释)。在这种情况下,您的意图会这样表达:

class extendedModel extends joint.shapes.devs.Model {
    // new properties go here
}