实现大接口

Implementing large interface

我正在使用具有大型接口的库

interface IOrder{
    cutomerId: number;
    deliveryAddress1: string;
   // and lots of properties...
}

我想实现一个 class 扩展它。

只是想确认是否有必要重新声明所有属性。

class Order implements IOrder{
        cutomerId: number;

       /*  error: Class 'Order' incorrectly implements interface 'IOrder'.
             Property 'deliveryAddress1' is missing in type 'Order'
       */
}

当然,方法需要实现,但我发现重新声明属性是多余的。我错过了什么吗?

是的,如果您实现接口,您必须重新声明所有字段。您可以通过创建一个函数来解决此问题,该函数创建一个实现该接口的 class。该实现实际上不会添加任何代码或字段,它只是声明如果接口只包含它可以工作的字段,它会这样做,尽管这些字段将保持未初始化状态,但如果它有方法,它们将是未定义的:

function autoExtend<T>(): new () => T {
    return class {} as any
}

class Order extends autoExtend<IOrder>() {

}

var cc = new Order();

cc.cutomerId = 0;

在 typescript 2.8 中,您还可以定义 autoExtend 来删除方法,以避免与方法接口的潜在错误:

type NonMethodKeys<T> = ({[P in keyof T]: T[P] extends Function ? never : P } & { [x: string]: never })[keyof T];  
type RemoveMethods<T> = Pick<T, NonMethodKeys<T>>; 

function autoExtend<T>(): new () => RemoveMethods< T> {
    return class {} as any
}

class Order extends autoExtend<IOrder>() implements IOrder {
    // Must define method
    method(){

    }
} 

您需要 re-declare 所有属性。因为接口绑定了实现的属性class

class Order implements IOrder{
    cutomerId: number;
    deliveryAddress1: string;
    /*all properties of interface ...*/

}