如何通过Interface类型填充对象并返回?

时间:2018-04-05 11:11:26

标签: typescript typescript2.0

我有以下按接口类型填充对象的函数:

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填充此附加数据。

1 个答案:

答案 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; }
}