当前位置: 首页 > article >正文

掌握 TypeScript 的 `Omit` 工具类型:灵活操作对象属性的艺术

引言

在 TypeScript 开发中,处理对象类型的灵活性和安全性是至关重要的。Omit 是一个非常实用的工具类型,它允许我们从对象类型中排除指定的属性,并返回一个新的类型。这在需要移除某些属性(如敏感信息)或修改组件 Props 时非常有用。本文将深入探讨 Omit 的用法及其应用场景。


基本概念

语法:

type NewType = Omit<OriginalType, KeysToOmit>;
  • OriginalType:原始的对象类型。
  • KeysToOmit:需要排除的属性名,可以是单个字符串或联合类型(多个属性名)。

基本用法

排除单个属性

type User = {
  id: number;
  name: string;
  email: string;
  password: string;
};

// 使用 Omit 排除 password 属性
type SafeUser = Omit<User, 'password'>;

const user: SafeUser = {
  id: 1,
  name: 'Alice',
  email: 'alice@example.com',
  // password: '123456' // 这里会报错,因为 password 被排除了
};

排除多个属性

type User = {
  id: number;
  name: string;
  email: string;
  password: string;
  createdAt: Date;
};

// 使用 Omit 排除 password 和 createdAt 属性
type PublicUser = Omit<User, 'password' | 'createdAt'>;

const publicUser: PublicUser = {
  id: 1,
  name: 'Bob',
  email: 'bob@example.com',
  // password: '123456', // 报错
  // createdAt: new Date(), // 报错
};

结合其他工具类型

结合 Pick

Pick 用于选择对象中的特定属性,而 Omit 则用于排除属性。两者结合使用可以更灵活地操作类型。

type User = {
  id: number;
  name: string;
  email: string;
  password: string;
};

// 先使用 Pick 选择部分属性,再使用 Omit 排除不需要的属性
type UserProfile = Omit<Pick<User, 'id' | 'name' | 'email'>, 'id'>;

const profile: UserProfile = {
  name: 'Charlie',
  email: 'charlie@example.com',
  // id: 1, // 报错,因为 id 被排除了
};

结合 Partial

Partial 将所有属性变为可选,与 Omit 结合使用可以实现更复杂的类型转换。

type User = {
  id: number;
  name: string;
  email: string;
  password: string;
};

// 使用 Partial 使所有属性可选,再使用 Omit 排除 password
type UpdateUser = Partial<Omit<User, 'password'>>;

const updateData: UpdateUser = {
  id: 1,
  name: 'David', // 可选
  email: 'david@example.com', // 可选
  // password: '123456', // 报错,因为 password 被排除了
};

在 React 组件中使用

Omit 在 React 中常用于扩展或修改组件的 Props 类型,特别是当你想封装第三方库的组件时。

封装 Ant Design 按钮组件

假设我们想封装 Ant Design 的 Button 组件,并排除 size 属性。

import { Button } from 'antd';
import type { ButtonProps } from 'antd';

type MyButtonProps = Omit<ButtonProps, 'size'>;

const MyButton: React.FC<MyButtonProps> = ({ ...resetProps }) => {
  return <Button {...resetProps} size='middle' />; // 强制设置 size 为 middle
}

// 使用
<MyButton type='primary' style={{ background: 'red' }}>我的按钮</MyButton>
// 错误用法,因为 MyButton 组件没有 size 属性
{/* <MyButton type='primary' style={{ background: 'red' }} size="middle">我的按钮</MyButton> */}

排除嵌套属性

Omit 只能直接排除一级属性。如果需要排除嵌套属性,可以结合其他工具类型或手动定义类型。

排除嵌套属性示例

type User = {
  id: number;
  name: string;
  profile: {
    age: number;
    address: string;
  };
  contact: {
    phone: string;
    email: string;
    weChat: string;
  }
};

// 手动定义新类型,排除 profile.age 和 contact.weChat
type UserWithoutAgeAndWeChat = Omit<User, 'profile' | 'contact'> & {
  profile: Omit<User['profile'], 'age'>;
  contact: Omit<User['contact'], 'weChat'>;
};

const user: UserWithoutAgeAndWeChat = {
  id: 1,
  name: 'Eve',
  profile: {
    address: '123 Main St',
    // age: 30, // 报错,因为 age 被排除了
  },
  contact: {
    phone: '123-456-7890',
    email: 'eve@example.com',
    // weChat: 'eve123', // 报错,因为 weChat 被排除了
  }
};

总结

  • Omit 的作用:从对象类型中排除指定的属性。
  • 常见场景
    • 移除敏感信息(如 password)。
    • 修改或扩展组件 Props。
    • 结合其他工具类型实现更复杂的类型操作。
  • 注意事项Omit 只能直接排除一级属性,处理嵌套属性时需要结合其他方法。

通过 Omit,你可以更灵活地定义和操作 TypeScript 类型,使代码更加简洁和类型安全。希望这些示例和解释能够帮助你更好地理解和应用 Omit 工具类型。


http://www.kler.cn/a/507030.html

相关文章:

  • HarmonyOS NEXT应用开发边学边玩系列:从零实现一影视APP (二、首页轮播图懒加载的实现)
  • Conda的一些常用命令
  • 浅谈云计算19 | OpenStack管理模块 (上)
  • Oracle 批量投入数据方法总结
  • 静态综合路由实验
  • Python在DevOps中的应用:自动化CI/CD管道的实现
  • [Qt]常用控件介绍-布局管理器-QVBoxLayout、QHBoxLayout、QGridLayout、QFormLayout、QSpace控件
  • AI实验室copilot自动化科研,AMD联手约翰霍普金斯大学:成本节约84%!
  • 【JVM-6】JVM 监控工具 jstat 的使用和具体应用案例
  • 【区间DP】【hard】力扣730. 统计不同回文子序列
  • css3网格布局
  • JavaEE:多线程初阶
  • shell安全类脚本(1.屏蔽每分钟访问过多的IP;2.拒绝ssh暴力破解)
  • MySQL基本知识梳理
  • linux上使用update-alternatives来选择软件版本
  • Jenkins+Docker一键打包部署项目!步骤齐全,少走坑路!
  • Vue3中使用组合式API通过路由传值详解
  • 模型参考自适应控制算法介绍及代码例程
  • 【机器学习:十八、更高级的神经网络概念】
  • Fiddler、Charles、Wireshark 和 Sniffmaster 工具对比
  • vscode【实用插件】Material Icon Theme 美化文件图标
  • 大疆发布可折叠航拍无人机,仅重249g,支持 4800 万像素拍摄
  • vue3+js使用elementplus的ElMessage弹窗报错:ElMessage‘ is not defined.eslintno-undef
  • mybatis的多对一、一对多的用法
  • Git在码云上的使用指南:从安装到推送远程仓库
  • 每日进步一点点(网安)