首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实现大接口

实现大接口
EN

Stack Overflow用户
提问于 2018-03-09 08:33:46
回答 2查看 143关注 0票数 1

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

代码语言:javascript
复制
interface IOrder{
    cutomerId: number;
    deliveryAddress1: string;
   // and lots of properties...
}

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

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

代码语言:javascript
复制
class Order implements IOrder{
        cutomerId: number;

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-03-09 08:40:25

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

代码语言:javascript
复制
function autoExtend<T>(): new () => T {
    return class {} as any
}

class Order extends autoExtend<IOrder>() {

}

var cc = new Order();

cc.cutomerId = 0;

在类型记录2.8中,还可以定义autoExtend以删除方法,以避免与方法的接口可能出现的错误:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2018-03-09 08:49:21

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

代码语言:javascript
复制
class Order implements IOrder{
    cutomerId: number;
    deliveryAddress1: string;
    /*all properties of interface ...*/

}

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49189557

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档