DRY与打字稿和构造函数选项对象

问题描述:

我有这样的代码:DRY与打字稿和构造函数选项对象

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

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

您不能扩展接口..并且实现接口并不意味着您继承了接口的字段。

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

你是正确的,你不能扩展接口,实现接口要求你再次写出属性。尽管这个解决方案改变了你的类的结构,但是一种方法是在类中使用接口类型创建一个属性。

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 
    } 
} 
+0

是的,这可能是一个很好的解决方案,将清理一些东西。绝对恼人的是必须在两个不同的地方保留相同的确切属性列表。 –

我经常使用的是以下几点:

export class Pool { 
    // ... 

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

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

+0

谢谢,你能解释一下参数在你的代码中做了什么吗? –

+0

@AlexanderMills'部分'与'Pool'相同,除了每个属性(包括每个方法)都是可选的。即你可以做'新的Pool({id:1337})'没有TypeScript抛出关于缺少属性的错误。如果没有'部分',你必须指定初始化对象中的每个属性,包括任何methods_。 –