是否存在一种更好的方法来初始化模型类,而无需使用 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);
}
}
答案 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);
}