使用 `omit` 函数移除敏感信息

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 编程环境,提供了类型安全的操作,确保移除的属性与原始对象中的属性类型一致。

功能概述

该函数接受两个参数:

  1. obj: 类型为 T 的对象,其中 T 是泛型约束,表示任意对象类型。
  2. 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;
}

实现细节

  1. 首先,通过对象扩展运算符 {...obj} 创建 obj 的浅复制,得到 clone 对象。
  2. 检查 fields 是否为数组,如果是,则使用 forEach 方法遍历数组中的每一个键名。
  3. 在遍历过程中,通过 delete 运算符从 clone 对象中删除对应键所对应的属性。
  4. 最后,返回经过处理后没有指定属性的 clone 对象。

使用示例

假设有一个用户对象接口:

interface User {
  id: number;
  name: string;
  email: string;
  password: string;
}

我们可以使用 omit 函数移除敏感信息:

const user: User = { id: 1, name: 'Alice', email: 'alice@example.com', password: 'secret' };
const safeUser = omit(user, ['password']);

// safeUser 的类型现在是 Omit<User, 'password'> 即 { id: number; name: string; email: string; }

注意事项

  • 该函数执行的是浅复制,因此对于嵌套对象,只会删除顶层指定键所指向的基本类型或引用类型,不会递归删除深层结构中的属性。
  • 如果 fields 参数不是数组,函数不会有任何效果(由于进行了数组类型的检查)。
posted @ 2024-04-10 21:34  龙陌  阅读(237)  评论(0)    收藏  举报