如何通过泛型ModelHelper类初始化Blog类成员?
实现方案
需求说明
需要将Blog类的构造函数改写为调用泛型ModelHelper.initMembers方法的形式,通过该工具类统一初始化类成员,替代原有的手动赋值逻辑。
完整实现代码
interface IBlog { title: string; content: string; } const initialBlogConfig: IBlog = { title: "", content: "", }; interface IModel { [key: string]: any; } class ModelHelper { static initMembers<T extends IModel, U extends IModel>(model: T, data: Partial<IModel>, initialModel: U): void { // 遍历初始配置的所有键,排除原型链属性 for (const key in initialModel) { if (initialModel.hasOwnProperty(key)) { // 优先使用传入的data值,为null/undefined时回退到初始配置 model[key] = data[key] !== null && data[key] !== undefined ? data[key] : initialModel[key]; } } } } class Blog implements IBlog { title: string; content: string; constructor(data: Partial<IModel> = {}) { // 调用工具类完成成员初始化 ModelHelper.initMembers(this, data, initialBlogConfig); } }
关键修改说明
- 泛型约束优化:给
ModelHelper.initMembers的泛型T和U加上extends IModel约束,确保传入的实例和初始配置符合键值对结构,避免类型错误。 - 循环安全处理:添加
hasOwnProperty检查,避免遍历到对象原型链上的无关属性。 - 构造函数简化:原构造函数的解构参数改为直接接收
Partial<IModel>类型的data,无需手动逐个赋值,所有初始化逻辑统一由工具类处理。 - 可扩展性提升:后续若要调整初始化规则(比如新增默认值逻辑、类型转换),只需修改
ModelHelper,无需改动业务类的构造函数。
内容的提问来源于stack exchange,提问作者Murmulodi
相关产品推荐
相关产品推荐

