【问题标题】:How to fill object by Interface type and return?如何按接口类型填充对象并返回?
【发布时间】:2018-04-05 19:24:35
【问题描述】:

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

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

【问题讨论】:

  • 所以_fillAddModel 填充了常用部分,而您希望能够在同一个调用中填充不常用部分?
  • 是的,我需要填写公共部分:fillAddModel 然后继续填写剩余部分
  • 也许以某种方式通过接口加入对象我的意思是加入输出fillAddModel 和对象ISubstitutionModelAddFree 然后继续填充?

标签: typescript typescript2.0


【解决方案1】:

您可以采用一个额外的参数来表示您要初始化的其余属性,该参数将包含泛型参数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; }
}

【讨论】:

  • 好极了!但是在返回之前传递 然后在函数中加入对象呢?
  • 不确定U 代表什么。你能写一个示例用法吗?
  • 我的意思是这样的:_fillAddModel&lt;T, U&gt;(properties) { let a&lt;T&gt;= {}; let b = &lt;U&gt;; let r = a.join(b); } 呼叫:_fillAddModel&lt;ISubstitutionModelAdd, ISubstitutionModelTeacher&gt;() {}
  • Multumesc pentru 回应,prieten!
  • 我正在考虑它,但我不是 100% 调用的外观,您需要知道属性才能在函数中分配它们,您不能直接为任意T。你可以复制Object.assign
猜你喜欢
  • 2023-03-29
  • 2021-09-29
  • 1970-01-01
  • 2017-05-15
  • 1970-01-01
  • 1970-01-01
  • 2019-11-18
  • 1970-01-01
相关资源
最近更新 更多