TS映射类型技巧
TypeScript 中的映射类型是什么
1. 概念介绍
TypeScript 中的映射类型和数学中的映射类似,能够将一个集合的元素转换为新集合的元素,只是 TypeScript 映射类型是将一个类型映射成另一个类型。
在我们实际开发中,经常会需要一个类型的所有属性转换为可选类型,这时候你可以直接使用 TypeScript 中的 Partial工具类型:
1 | type User = { |
这样我们就实现了将 User类型映射成 User2类型,并且将 User类型中的所有属性转为可选类型。
2. 实现方法
TypeScript 映射类型的语法如下:
1 | type TypeName<Type> = { |
我们既然可以通过 Partial工具类型非常简单的实现将指定类型的所有属性转换为可选类型,那其内容原理又是如何?
我们可以在编辑器中,将鼠标悬停在 Partial名称上面,可以看到编辑器提示如下:
1 | type Partial<T> = { [P in keyof T]?: T[P] | undefined; } |
拆解一下其中每个部分:
type Partial<T>:定义一个类型别名 Partial和泛型 T;keyof T:通过 keyof操作符获取泛型 T中所有 key,返回一个联合类型(如果不清楚什么是联合类型,可以理解为一个数组);
1 | type User = { |
in:类似 JS 中 for...in中的 in,用来遍历目标类型的公开属性名;T[P]:是个索引访问类型(也称查找类型),获取泛型 T中 P类型,类似 JS 中的访问对象的方式;?:将类型值设置为可选类型;{ [P in keyof T] ?: T[P] | undefined}:遍历 keyof T返回的联合类型,并定义用 P变量接收,其每次遍历返回的值为可选类型的 T[P]。
这样就实现了 Partial工具类型,这种操作方法非常重要,是后面进行 TypeScript 类型体操的重要基础。
映射类型的应用
TypeScript 映射类型经常用来复用一些对类型的操作过程,比如 TypeScript 目前支持的 21 种工具类型,将我们常用的一些类型操作定义成这些工具类型,方便开发者复用这些类型。
所有已支持的工具类型可以看下官方文档:
https://www.typescriptlang.org/docs/handbook/utility-types.html
下面我们挑几个常用的工具类型,看下其实现过程中是如何使用映射类型的。
在学习 TypeScript 过程中,推荐多在官方的 Playground 练习和学习:
https://www.typescriptlang.org/zh/play
1. Required 必选属性
用来将类型的所有属性设置为必选属性。
实现如下:
1 | type Required<T> = { |
使用方式:
1 | type User = { |
这边的 -?符号可以暂时理解为“将可选属性转换为必选属性”,下一节会详细介绍这些符号。
2. Readonly 只读属性
用来将所有属性的类型设置为只读类型,即不能重新分配类型。
实现如下:
1 | type Readonly<T> = { |
使用方式:
1 | type User = { |
3. Pick 选择指定属性
用来从指定类型中选择指定属性并返回。
实现如下:
1 | type Pick<T, K extends keyof T> = { |
使用如下:
1 | type User = { |
4. Omit 忽略指定属性
作用类似与 Pick工具类型相反,可以从指定类型中忽略指定的属性并返回。
实现如下:
1 | type Omit<T, K extends string | number | symbol> = { |
使用方式:
1 | type User = { |
5. Exclude 从联合类型中排除指定类型
用来从指定的联合类型中排除指定类型。
实现如下:
1 | type Exclude<T, U> = T extends U ? never : T; |
使用方式:
1 | type User = { |
映射修饰符的应用
在自定义映射类型的时候,我们可以使用两个映射类型的修饰符来实现我们的需求:
readonly修饰符:将指定属性设置为只读类型;?修饰符:将指定属性设置为可选类型;
前面介绍 Readonly和 Partial工具类型的时候已经使用到:
1 | type Readonly<T> = { |
当然,也可以对修饰符进行操作:
+添加修饰符(默认使用);-删除修饰符;
比如:
1 | type Required<T> = { |
也可以放在前面使用:
1 | type NoReadonly<T> = { |
构造器参数
在实现构造器传参时,可以通过ConstructorParameters<T>提供参数提示
1 | class Sub{ |
- Title: TS映射类型技巧
- Author: Janing
- Created at : 2025-09-25 20:14:00
- Updated at : 2025-09-25 20:34:14
- Link: https://your-domain.com/TS映射类型技巧/
- License: This work is licensed under CC BY-NC-SA 4.0.