You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现适配多含email属性类型的cleanEmail通用函数?

解决方案

要让cleanEmail适配所有带email属性的类型,同时保留原对象的完整类型,用TypeScript泛型+类型约束就能优雅解决,具体实现如下:

基础实现(直接修改原对象)

const cleanEmail = <T extends { email: string }>(user: T): T => {
  user.email = user.email.trim()
  return user
}
  • <T extends { email: string }>:泛型T被约束为所有包含email: string属性的类型,不管对象还有其他什么字段都能匹配。
  • 返回值类型T:保证函数返回的对象和传入的类型完全一致,不会丢失原类型的其他属性定义。

这样不管是CreateUser、UpdateUser,还是后续新增的带email的类型,都能直接传入cleanEmail,不需要修改函数本身。

更安全的纯函数实现(不修改原对象)

如果不想修改传入的原始对象(避免副作用),可以返回一个新对象:

const cleanEmail = <T extends { email: string }>(user: T): T => {
  return { ...user, email: user.email.trim() }
}

这种方式会复制原对象的所有属性,仅替换清理后的email,更符合纯函数的设计原则,尤其适合处理不可变对象的场景。

后续扩展

以后新增任何带email: string的类型,比如:

type AdminUser = {
  email: string
  password: string
  role: string
}

export const addAdmin = (admin: AdminUser) => {
  db.prepare(sqlInsertAdmin).run(cleanEmail(admin))
}

直接调用cleanEmail即可,完全不需要调整函数的类型定义,实现了真正的复用。

内容的提问来源于stack exchange,提问作者Junghard

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 06:50:26