如何为添加/替换键值的对象复制函数添加实用泛型类型?
实现泛型化的
extend函数 当然可行,你可以通过TypeScript的泛型与索引类型直接实现这个需求,无需依赖内置工具类型。
泛型化后的函数实现
function extend<T extends object, K extends string, V>( obj: T, key: K, value: V ): Omit<T, K> & { [P in K]: V } { return { ...obj, [key]: value } as Omit<T, K> & { [P in K]: V }; }
类型参数说明
T extends object:约束第一个参数obj为任意对象类型,调用时会自动推断传入对象的具体类型K extends string:约束第二个参数key为字符串字面量类型,确保调用时传入的是具体的常量字符串V:第三个参数value的类型,调用时自动推断传入值的类型
返回类型逻辑
返回类型Omit<T, K> & { [P in K]: V }的作用是:
- 用
Omit<T, K>移除原对象obj中K键对应的旧类型 - 通过交叉类型
&添加新的K键类型V,实现对原有键类型的覆盖,无论新旧类型是否一致
使用示例
// 覆盖已有键(类型不同) const user = { name: "Alice", age: 25 }; const updatedUser = extend(user, "age", "二十五"); // updatedUser 的类型为:{ name: string; age: string } // 添加新键 const product = { id: 101, name: "Laptop" }; const updatedProduct = extend(product, "price", 5999); // updatedProduct 的类型为:{ id: number; name: string; price: number }
内容的提问来源于stack exchange,提问作者Phoebe Goldman
相关产品推荐
相关产品推荐

