实现大型接口

时间:2018-03-09 08:33:47

标签: typescript interface implementation

我正在使用具有大型界面的库

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

我想实现一个扩展它的类。

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

class Order implements IOrder{
        cutomerId: number;

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

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

2 个答案:

答案 0 :(得分:1)

是的,如果实现界面,则必须重新声明所有字段。您可以通过创建一个创建实现接口的类的函数来执行解决方法。该实现实际上不会添加任何代码或字段,如果接口仅包含它可用的字段,它只会声明它会这样做,尽管字段将保持未初始化,但如果它有方法则它们将取消定义:

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(){

    }
} 

答案 1 :(得分:0)

您需要重新声明所有属性。因为接口绑定了实现类的属性

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

}