Typescript定义文件:实现类的重复接口成员?

时间:2015-10-30 08:42:30

标签: typescript typescript1.6 definitelytyped

我正在尝试编写一个紧凑的打字稿定义文件,但是对于一个更大的项目我遇到了麻烦。

我的项目有很多接口,由许多类实现。

从我所看到的,我总是需要重新"实现" /重新声明类中接口的方法,如下所示:

declare module someModule {

    interface InterfaceOne {
        /**
        * Some lengthy description
        */
        someStuff():any;
        /**
        * Some lengthy description
        */
        moreStuff():any;
    }

    class OneClass implements InterfaceOne {
        /**
        * Some lengthy description
        */
        someStuff():any;
        /**
        * Some lengthy description
        */
        moreStuff():any;
        /**
        * Even more description
        */
        classStuff(): any;
    }

    class TwoClass implements InterfaceOne {
        /**
        * Some lengthy description
        */
        someStuff():any;
        /**
        * Some lengthy description
        */
        moreStuff():any;
        /**
        * Even more description
        */
        classStuff(): any;
    }
}   

如果我从接口中省略someStuffmoreStuff声明 我收到这个错误:

  

错误TS2137:类TwoClass声明接口InterfaceOne但未实现它:

所以我总是需要将所有声明复制到实现该接口的每个类。

有什么方法吗?为什么我需要这样做?是否有任何充分的理由将所有接口的组合内容复制到库声明文件中的类主体?它只是一个声明,而不是实现,所以为什么我的声明implements InterfaceOne已经不够了?我也不需要将所有基类型成员从超类型复制到扩展类型,那么为什么接口的不同呢?

在我正在编写的库中,这些接口的定义文件实际上是mixins,所以最后我的定义文件实际上比具有主体的原始实现更长!

编辑:发布后我发现this answer - 所以我的问题很可能是重复的,尽管另一个问题是针对较旧版本的Typescript。

编辑:我意识到这可能不是讨论这个的正确位置,我正在考虑删除这个问题。作为参考,我在this official typescript issue中提出了问题。

2 个答案:

答案 0 :(得分:0)

<强> EDITED

declare module someModule {

    interface InterfaceOne {
        /**
         * Some lengthy description
         */
        someStuff():any;
        /**
         * Some lengthy description
         */
        moreStuff():any;
    }

   interface OneClass extends InterfaceOne {
       new(): OneClass;
       /**
         * Even more description
         */
        classStuff(): any;
   }

   interface TwoClass extends InterfaceOne {
       new(): TwoClass;
       /**
         * Even more description
         */
        classStuff(): any;
   }

}

(在公共汽车上这样做,需要更多检查)

答案 1 :(得分:0)

您是否尝试过界面/类合并?

https://www.typescriptlang.org/docs/handbook/declaration-merging.html

export interface Foo {
    bar: string;
}

export class Foo {
    constructor() { this.bar = 'foobar'; }
}

export interface AnotherFoo extends Foo {}

export class AnotherFoo {
    foo = 'bar'; // add a foo member only to this class
}