我有以下按接口类型填充对象的函数:
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
填充对象,然后返回对象并通过接口T
填充此附加数据。
答案 0 :(得分:2)
您可以使用一个额外的参数来表示您要初始化的其余属性,此参数将包含泛型参数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; }
}