【问题标题】:Implementing large interface实现大接口
【发布时间】:2018-03-09 08:33:46
【问题描述】:

我正在使用一个接口很大的库

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'
       */
}

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

【问题讨论】:

标签: typescript interface implementation


【解决方案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(){

    }
} 

【讨论】:

  • 向您的优雅解决方案致敬
  • @Joan 10x,还添加了一个 2.8 版本,从接口中删除了方法以提高安全性:)
  • 细化!我还没有安装 2.8,但更简单的第一个效果很好。
【解决方案2】:

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

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

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-03
    • 2016-06-20
    • 2013-09-25
    • 2011-08-28
    • 2014-08-21
    • 2017-07-02
    相关资源
    最近更新 更多