2

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

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

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

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;
    }
}   

如果我从接口中省略someStuffandmoreStuff声明,我会收到此错误:

错误 TS2137:类 TwoClass 声明了接口 InterfaceOne 但没有实现它:

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

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

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

编辑:发布后我找到了这个答案- 所以我的问题很可能是重复的,尽管另一个问题是针对旧版本的 Typescript。

编辑:我意识到这可能不是讨论这个问题的正确地方,我正在考虑删除这个问题。作为参考,我在这个官方打字稿问题中提出了这个问题

4

2 回答 2

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
}
于 2017-12-01T03:23:09.580 回答
0

已编辑

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;
   }

}

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

于 2015-10-30T12:40:55.867 回答