如何实现适配多含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
相关产品推荐
相关产品推荐

