export default function omit<T extends object, K extends keyof T>(
obj: T,
fields: K[] | readonly K[],
): Omit<T, K> {
const clone = { ...obj };
if (Array.isArray(fields)) {
fields.forEach(key => {
delete clone[key];
});
}
return clone;
}
title: omit
nav:
title: Demo
path: /demo
设计文档:omit 函数
目标与用途
omit
函数旨在从给定的对象中移除指定的一组属性(键),并返回一个新的对象,新对象包含了原对象所有属性但不包含被移除的属性。这个函数适用于 TypeScript 编程环境,提供了类型安全的操作,确保移除的属性与原始对象中的属性类型一致。
功能概述
该函数接受两个参数:
obj
: 类型为T
的对象,其中T
是泛型约束,表示任意对象类型。fields
: 类型为K[] | readonly K[]
的数组,其中K
也是泛型约束,扩展自keyof T
,代表obj
中的任何合法键名。
函数返回一个类型为 Omit<T, K>
的新对象,这里的 Omit
是 TypeScript 中的一个内置实用工具类型,用于创建一个排除了指定键的新类型。
函数签名与实现
export default function omit<T extends object, K extends keyof T>(
obj: T,
fields: K[] | readonly K[],
): Omit<T, K> {
// 创建一个对原始对象的浅拷贝
const clone = { ...obj };
// 遍历要移除的字段数组
if (Array.isArray(fields)) {
fields.forEach((key: K) => {
// 从克隆对象中删除指定的键
delete clone[key];
});
}
// 返回剔除了指定字段后的对象
return clone;
}
实现细节
- 首先,通过对象扩展运算符
{...obj}
创建obj
的浅复制,得到clone
对象。 - 检查
fields
是否为数组,如果是,则使用forEach
方法遍历数组中的每一个键名。 - 在遍历过程中,通过
delete
运算符从clone
对象中删除对应键所对应的属性。 - 最后,返回经过处理后没有指定属性的
clone
对象。
使用示例
假设有一个用户对象接口:
interface User {
id: number;
name: string;
email: string;
password: string;
}
我们可以使用 omit
函数移除敏感信息:
const user: User = { id: 1, name: 'Alice', email: '[email protected]', password: 'secret' };
const safeUser = omit(user, ['password']);
// safeUser 的类型现在是 Omit<User, 'password'> 即 { id: number; name: string; email: string; }
注意事项
- 该函数执行的是浅复制,因此对于嵌套对象,只会删除顶层指定键所指向的基本类型或引用类型,不会递归删除深层结构中的属性。
- 如果
fields
参数不是数组,函数不会有任何效果(由于进行了数组类型的检查)。