TypeScript中如何将类属性作为参数传入函数并在内部完成更新
TypeScript 实现通用Modal编辑函数方案
核心思路
使用泛型约束+keyof运算符绑定属性名和对应值的类型关系,解决直接使用keyof时类型无法对齐导致的赋值报错问题。
前置类型定义
首先定义你的个人资料实体类型:
interface UserProfile { name: string; gender: 'male' | 'female' | 'other'; email: string; // 其他需要编辑的属性 }
通用函数实现
基于Ionic的ModalController封装,自动完成读值、唤起弹窗、回写逻辑:
import { ModalController } from '@ionic/angular'; import { ComponentType } from '@angular/core'; // 非Angular项目可替换为对应框架的组件类型 // 通用编辑弹窗Props约束,保证所有编辑弹窗入参格式统一 interface EditModalProps<T> { initialValue: T; } async function openProfileEditModal<K extends keyof UserProfile>( profileInstance: UserProfile, editField: K, modalComponent: ComponentType<EditModalProps<UserProfile[K]>>, modalController: ModalController ): Promise<void> { // 读取当前字段值,类型自动匹配对应属性的类型 const initialValue = profileInstance[editField]; // 创建并唤起弹窗 const modal = await modalController.create({ component: modalComponent, componentProps: { initialValue } }); await modal.present(); // 监听弹窗关闭,回写新值 const { data: newValue } = await modal.onWillDismiss(); if (newValue !== undefined) { // 此处可直接赋值,类型完全匹配无报错 profileInstance[editField] = newValue; } }
调用示例
原来的6个重复函数可全部简化为如下调用:
// 编辑姓名 async handleEditName() { await openProfileEditModal(this.userProfile, 'name', NameEditModal, this.modalCtrl); } // 编辑性别 async handleEditGender() { await openProfileEditModal(this.userProfile, 'gender', GenderEditModal, this.modalCtrl); } // 编辑邮箱 async handleEditEmail() { await openProfileEditModal(this.userProfile, 'email', EmailEditModal, this.modalCtrl); }
原问题原因说明
之前直接使用keyof UserProfile作为参数类型时,TypeScript会将该参数推断为所有属性键的联合类型,无法对应到具体某个属性的类型,赋值时会因为类型不兼容报错。使用泛型K extends keyof UserProfile后,TypeScript会根据传入的具体字段名锁定K的类型,UserProfile[K]会自动解析为该字段的对应类型,读写操作均满足类型安全要求。
内容的提问来源于stack exchange,提问作者Banns
相关产品推荐
相关产品推荐

