首页 文章

使用TypeScript和带有选项对象的构造函数进行DRY

提问于
浏览
3

我有这个代码:

export interface LDAPPoolOpts {
  id: number;
  size: number;
  connOpts: any;
  active: Array<any>;
  inactive: Array<any>;
  dn: string;
  pwd: string;
  waitingForClient: Array<Function>
}


export class Pool {

  id: number;
  size: number;
  connOpts: any;
  active: Array<any>;
  inactive: Array<any>;
  dn: string;
  pwd: string;
  waitingForClient: Array<Function>;

  constructor(opts: LDAPPoolOpts) {}

 }

正如您所看到的,此类的构造函数只需要一个类型为: LDAPPoolOpts 的options对象 .

我的问题是:如何通过必须为类和选项对象接口声明完全相同的字段来避免重复自己?

您无法扩展接口 . 实现接口并不意味着您继承接口的字段 .

我应该声明一个类型而不是一个接口吗?

2 回答

  • 3

    您是正确的,因为您无法扩展接口并且实现接口需要您再次写出属性 . 虽然此解决方案改变了类的结构,但一种方法是使用接口类型在类上创建属性 .

    export interface LDAPPoolOpts {
        id: number;
        size: number;
        connOpts: any;
        active: Array<any>;
        inactive: Array<any>;
        dn: string;
        pwd: string;
        waitingForClient: Array<Function>
    }
    
    
    export class Pool {
         opts: LDAPPoolOpts;
    
         constructor(opts: LDAPPoolOpts) {
             this.opts = opts; // assign to the property how you see fit
         }
    }
    
  • 1

    我经常使用的是以下内容:

    export class Pool {
        // ...
    
        constructor(initializer?: Partial<Pool>) {
            if (initializer) {
                Object.assign(this, initializer)
            }
        }
    }
    

    当然,这假定该类具有与假定的初始化对象相同的属性,因此这与C#中的对象初始化非常相似 . 如果您还要将实例成员初始化为有意义的默认值,则此方法最有效 .

相关问题