2016-10-12 22 views
1

我是新来的打字稿,我的代码有很多重复的引用(data1,data2,data3 ...)。OOP/Typescript - 当类构造函数将接口对象作为参数时是否可以优化代码?

export interface ProjectInterface{ 
    data1: string; 
    data2: string; 
    data3: number; 
} 

export class Project { 
    data1: string; 
    data2: string; 
    data3: number; 

    constructor(obj: ProjectInterface) { 
    this.data1 = obj.data1; 
    this.data2 = obj.data2; 
    this.data3 = obj.data3; 
    } 
} 

我知道我可以在构造函数中传递data1,data2 ......但是当你有很多参数时它并不方便。

是否有一个干净的解决方法,以保持接口有引用的单一入口点?

+0

所以你想在构造函数中自动化属性初始化?我不一定把这称为_optimization_,更像是一种语义优化。 –

+0

是的我想避免在Project类中重复变量声明并自动初始化 – sebap

+0

为什么不在'Project'类中声明'ProjectInterface'类型的属性'data',并且只需要'this.data = obj'?使用'Object.assign'还可以在注入的数据和Class实例持有的数据之间引入一些灵活性。 –

回答

2

我想,以避免项目重复类变量声明和使自动化初始化

虽然这肯定不会把它切所有的情况下,你的情况,你可以使用Object.keys来遍历的obj自己的属性,同时还执行一些基本的类型检查:

constructor(obj: ProjectInterface) { 
    Object.keys(obj).forEach(key => { 
     if (this.hasOwnProperty(key) && typeof this[key] == typeof obj[key]) { 
      this[key] = obj[key]; 
     } 
    }); 
} 

然而,这需要你也INI请将您的属性设置为合理的默认值,否则hasOwnProperty将返回false。

请注意,ES6 arrow function保留了this的正确词汇范围。

+0

谢谢,我在想那样的事情。但这是否意味着我不必在类项目中声明变量data1,data2 ..看起来像作弊:) – sebap

+0

不幸的是,你必须。而且你还必须将它们初始化为一个默认值(这样'hasOwnProperty'才能返回true),我忘了在答案中包含它。 –

相关问题