TS 全局泛型工具Pick、Omit

Pick和Omit是TypeScript中的全局泛型工具,用于处理对象类型。Pick可以从对象类型中选取特定属性,例如从User接口中选取id和token,而Omit则用于排除特定属性,如从User接口中移除token和mobile,保留其余属性。

Pick 与 Omit 【TS内置全局类型】

【 一 】: Pick 可以从一个对象类型中 取出某些属性

  • 全局泛型工具 Pick 可以从一个对象类型中 取出某些属性

  • 使用: Pick<要拾取的类型,要拾取的属性1,要拾取的属性2>

// 测试信息类型
export interface User {
  account: string
  avatar: string
  id: string
  mobile: string
  token: string
}

// 使用Pick泛型工具: 抽取 id 和 token
export type PickUserTest = Pick<User, 'id', 'token'>

// 结果:PickUserTest === {id: string,token: string}

【 二 】: Omit 可以从一个对象类型中 排出某些属性

  • 全局泛型工具 Omit 可以从一个对象类型中 排出某些属性

  • 使用: Omit<要排除的类型,要排除的属性1,要排除的属性2>

// 测试信息类型
export interface User {
  account: string
  avatar: string
  id: string
  mobile: string
  token: string
}

// 使用 Omit 泛型工具:  去掉 token 和 mobile
export type OmitUserTest = Omit<User, 'token','mobile'>

// 结果:OmitUserTest === {account: string,avatar: string,id: string}

【 三 】:小结:

  • Pick 作用?

  • 从类型对象中 取出指定的属性类型

  • Omit 作用?

  • 从类型对象中排出 指定的属性类型,得到剩余的属性类型

<think>嗯,用户想了解 TypeScript 中的。首先,我需要回忆的基本概念。TS 中是用来创建可复用组件的,允许类作为参数,提高代码的灵活性和安全性。用户可能已经知道一些类基础,但想深入。 接下来,用户的应用场景可能是什么?他们可能在写函数或类时需要处理多种数据类,但不想重复代码。比如,一个处理数组或API响应的函数。这时候就能派上用场,避免使用 any 类失去类检查的好处。 用户可能的疑问点包括语法、使用场景、高级用法如约束、默认类等。需要分步骤解释,从简单例子入手,逐步深入。比如先展示没有的问题,再引入解决方案。 要注意用户可能对类参数的理解有困难,需要用类比,比如函数的参数但作用于类。同时,要强调的好处:代码复用和类安全。举例说明,比如 identity 函数,用 any 会丢失类信息,用则保留。 可能还需要提到在接口、类中的应用,以及常见工具如 Partial、Readonly 的实现原理。此外,约束和默认值也是重要部分,比如 extends 和 keyof 的使用,帮助用户处理更复杂的情况。 需要检查是否有常见的错误理解,比如认为会增加运行时开销,但实际上只在编译时起作用。还要提醒类推断的情况,有时候不需要显式指定类参数,编译器会自动推断。 最后,总结使用的最佳实践,比如何时使用,如何保持代码简洁,避免过度使用导致代码难以理解。确保用户不仅知道怎么用,还知道何时用,以及背后的设计理念。</think>好的,我来为您逐步讲解 TypeScript 中的(Generics): # 一、为什么需要? 假设我们要写一个返回参数本身的函数: ```typescript // 使用 any 的写法(不安全) function identity(arg: any): any { return arg } ``` - ✅ 可以接受任意类 - ❌ 丢失了类信息(输入 number 会被推断为 any) # 二、的基本使用 用类变量 `<T>` 解决上述问题: ```typescript // 写法(保持类) function identity<T>(arg: T): T { return arg } // 使用示例 const output1 = identity<string>("hello") // 显式指定类 const output2 = identity(42) // 自动类推断(推荐) ``` - `T` 会捕获传入的类,并在整个函数中保持这个类 - 支持类推断,通常不需要显式指定 # 三、的核心特点 1. **类参数化**:把类当作参数传递 2. **代码复用**:一套逻辑支持多种类 3. **类安全**:编译时进行类检查 # 四、常见应用场景 ## 1. 处理数组 ```typescript function getFirst<T>(arr: T[]): T { return arr[0] } // 使用 const num = getFirst([1, 2, 3]) // number 类 const str = getFirst(["a", "b", "c"]) // string 类 ``` ## 2. 接口中使用 ```typescript interface ApiResponse<T> { code: number message: string data: T } // 使用 const userResponse: ApiResponse<{name: string, age: number}> = { code: 200, message: "success", data: { name: "Alice", age: 30 } } ``` ## 3. 类中使用 ```typescript class Box<T> { private content: T constructor(value: T) { this.content = value } getValue(): T { return this.content } } // 使用 const numberBox = new Box<number>(42) const stringBox = new Box("hello") // 自动推断为 string ``` # 五、高级用法 ## 1. 约束(Generic Constraints) ```typescript interface HasLength { length: number } function logLength<T extends HasLength>(arg: T): void { console.log(arg.length) } logLength("hello") // 5 logLength([1,2,3]) // 3 logLength(123) // 错误:number 没有 length 属性 ``` ## 2. 使用类参数 ```typescript function getProperty<T, K extends keyof T>(obj: T, key: K) { return obj[key] } const person = { name: "Bob", age: 25 } getProperty(person, "age") // 正确 getProperty(person, "email") // 错误:email 不存在于 person ``` ## 3. 默认类参数 ```typescript interface Pagination<T = string> { data: T[] pageSize: number total: number } // 使用默认类 const strPagination: Pagination = { /*...*/ } // 自定义类 const numPagination: Pagination<number> = { /*...*/ } ``` # 六、最佳实践建议 1. 优先让 TypeScript 自动推断类 2. 当需要类关系时才使用 3. 使用有意义的类参数名称(如 T, U, V 或更具体的名称) 4. 避免过度使用导致代码可读性下降 # 七、常见工具原理 这些内置工具都是基于实现的: ```typescript type Partial<T> = { [P in keyof T]?: T[P] } type Readonly<T> = { readonly [P in keyof T]: T[P] } type Pick<T, K extends keyof T> = { [P in K]: T[P] } ``` 通过,我们可以编写类安全且高度复用的代码,这是 TypeScript系统中非常强大的特性。建议从简单场景开始实践,逐步掌握更复杂的用法。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不叫虎子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值