如何按接口类型和 return 填充对象?
How to fill object by Interface type and return?
我有以下按接口类型填充对象的函数:
public _fillAddModel<T>(lessonId: number, studyPeriodId: number, confirmed: boolean = false): T {
let data: T;
data = {
lesson: this.substitution.lessonNumber,
schoolStudyPeriod: GlobalModel.getSelectedPeriod().id,
confirmed: true
};
return data;
}
这样调用:
let data = this._fillAddModel<ISubstitutionModelTeacher>(1, 2, true);
let data = this._fillAddModel<ISubstitutionModelAddTeacherSubject>(1, 2, true);
如您所见,我尝试通过接口填充对象:T
然后在之后继续填充此接口:
data.subsDate = this.substitution.date;
所有接口扩展主接口:ISubstitutionModelAdd
:
export interface ISubstitutionModelTeacher extends ISubstitutionModelAdd {
newTeacher: number;
subsDate: string;
}
export interface ISubstitutionModelAddTeacherSubject extends ISubstitutionModelAdd {
newTeacher: number;
subsDate: string;
classSubject: number;
}
export interface ISubstitutionModelAddFree extends ISubstitutionModelAdd {
subsDate: string;
remark: string;
}
我的问题是通过默认接口 ISubstitutionModelAdd
填充对象然后 return 对象并通过接口 T
.
填充此附加数据
您可以采用一个额外的参数来表示您要初始化的其余属性,此参数将包含通用参数 T
的所有属性减去您作为其他参数传递的属性:
class Filler {
_fillAddModel<T extends ISubstitutionModelAdd>(lessonId: number, studyPeriodId: number, otherFields: Pick<T, Exclude<keyof T, 'lesson' | 'schoolStudyPeriod'>>): T {
let data = Object.assign({
lesson: this.getLessonById(lessonId),
schoolStudyPeriod: this.getStudyPeriodId(studyPeriodId),
}, otherFields);
return data as any;
}
// Usage
test() {
let data = this._fillAddModel<ISubstitutionModelTeacher>(1, 2, {
subsDate: "",
confirmed: true,
newTeacher: 0
});
}
// Dummy methods
getLessonById(lessonId: number): number{ return lessonId; }
getStudyPeriodId(studyPeriodId: number): number{ return studyPeriodId; }
}
我有以下按接口类型填充对象的函数:
public _fillAddModel<T>(lessonId: number, studyPeriodId: number, confirmed: boolean = false): T {
let data: T;
data = {
lesson: this.substitution.lessonNumber,
schoolStudyPeriod: GlobalModel.getSelectedPeriod().id,
confirmed: true
};
return data;
}
这样调用:
let data = this._fillAddModel<ISubstitutionModelTeacher>(1, 2, true);
let data = this._fillAddModel<ISubstitutionModelAddTeacherSubject>(1, 2, true);
如您所见,我尝试通过接口填充对象:T
然后在之后继续填充此接口:
data.subsDate = this.substitution.date;
所有接口扩展主接口:ISubstitutionModelAdd
:
export interface ISubstitutionModelTeacher extends ISubstitutionModelAdd {
newTeacher: number;
subsDate: string;
}
export interface ISubstitutionModelAddTeacherSubject extends ISubstitutionModelAdd {
newTeacher: number;
subsDate: string;
classSubject: number;
}
export interface ISubstitutionModelAddFree extends ISubstitutionModelAdd {
subsDate: string;
remark: string;
}
我的问题是通过默认接口 ISubstitutionModelAdd
填充对象然后 return 对象并通过接口 T
.
您可以采用一个额外的参数来表示您要初始化的其余属性,此参数将包含通用参数 T
的所有属性减去您作为其他参数传递的属性:
class Filler {
_fillAddModel<T extends ISubstitutionModelAdd>(lessonId: number, studyPeriodId: number, otherFields: Pick<T, Exclude<keyof T, 'lesson' | 'schoolStudyPeriod'>>): T {
let data = Object.assign({
lesson: this.getLessonById(lessonId),
schoolStudyPeriod: this.getStudyPeriodId(studyPeriodId),
}, otherFields);
return data as any;
}
// Usage
test() {
let data = this._fillAddModel<ISubstitutionModelTeacher>(1, 2, {
subsDate: "",
confirmed: true,
newTeacher: 0
});
}
// Dummy methods
getLessonById(lessonId: number): number{ return lessonId; }
getStudyPeriodId(studyPeriodId: number): number{ return studyPeriodId; }
}