初始化模型类成员的最佳方法

时间:2019-07-16 12:01:28

标签: angular typescript

是否存在一种更好的方法来初始化模型类,而无需使用 undefined 显式定义每个成员?

最初的想法是能够在扩展类中调用super(data);

class Model {
    construct(data: any) {
        Object.keys(this).forEach(key => {
            this[key] = data[key];
        });
    }
}

class User extends Model {

    id: number = undefined;
    name: string = undefined;

    constructor(data: any) {
        super();
        this.construct(data);
    } 
}

3 个答案:

答案 0 :(得分:2)

我更喜欢使用界面。这是指向typescript playground进行演示的链接。

interface Thing {
    numberProp: number;
    stringProp: string;
    notRequiredStringProp?: string;
    anotherNotRequiredStringProp?: string;
}

let myThing: Thing = {
    numberProp: 31232,
    stringProp: 'Hello'
};

alert(myThing.numberProp);
alert(myThing.stringProp);
alert(myThing.notRequiredStringProp);
alert(myThing.anotherNotRequiredStringProp);

编辑

这是您可以通过Web服务访问数据的方式。无需调用构造函数。

export class ThingService {
   constructor(private httpClient: HttpClient){}

   // Returns a collection of "Thing"
   getThings(): Observable<Thing[]>{
      return this.httpClient.get('api/things')
   }

   // Returns a "Thing" by it's unique identifier
   getThingById(id: number): Observable<Thing>{
      return this.httpClient.get('api/things/' + id)
   }
}

然后,在组件中的用法可能是:

ngOnInit(){
  this.thingService.getThings().subscribe((things: Thing[]) => {
      //do something with things
  });
} 

答案 1 :(得分:1)

您可以使用可选参数和公共/私有修饰符创建一个构造函数。这样,您可以在不使用参数的情况下调用构造函数,并且仍然拥有一个强大的模型。

class User {    
    constructor(public id?: any, public name? : any) {} 
}

这等效于,但较不冗长:

class User {
    constructor(id, name) {
        this.id = id;
        this.name = name;
    }
}

如果要将对象转换为用户,则可以使用assign实现绑定方法:

class User {    
    constructor(public id?: any, public name? : any) {} 

    bind(object: any): Equipe {
        return Object.assign(this, object);
    }  

}

最后,如果您想要一个真正强大的模型,则可以在bind方法中使用Object.seal,不允许向用户添加动态属性:

class User {    
    constructor(public id?: any, public name? : any) {} 

    bind(object: any): Equipe {
        return Object.assign(Object.seal(this), object);
    }  
} 

现在您可以通过以下方式实例化用户:

let user = new User(); // user = {id: undefined, name: undefined}

并绑定到另一个对象:

let user = new User().bind({id: 1, name: 'bob'})

答案 2 :(得分:-1)

如果没有逻辑,则可以在构造函数中执行以下操作:

constructor( data: any){
     Object.assign(this, data);
}