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

时间:2017-06-14 20:27:39

标签: javascript typescript typescript2.0

我有这段代码:

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的选项对象。

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

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

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

3 个答案:

答案 0 :(得分: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 :(得分:2)

我经常使用以下内容:

export class Pool {
    // ...

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

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

答案 2 :(得分:0)

2020 年更新

现在可以用最少的样板做你想做的事:

N = 5;
typp = "b";
mu = 2;

function bigfun()

  function f(u,mu)
    ee = mu*u;
    return ee
  end

  function g(uv,mu)
    ee = (mu^2)*uv
    return ee;
  end

  while 1 == 1

    u = ones(N);
    if typp == "a"
      ff(u) = f(u,mu);
    elseif typp == "b"
      ff(u) = g(u,mu);
    end
    fu = ff(u);
    break;

  end

end

bigfun();

https://github.com/Microsoft/TypeScript/issues/340#issuecomment-184964440