17 TypeScript 映射类型
只读类型 Readonly
定义:用于将 T 类型的所有属性设置为只读状态。
type Readonly<T> = {
readonly [P in keyof T]: T[P]
}用法:
interface Person {
name: string
age: number
}
const person: Readonly<Person> = {
name: 'Lucy',
age: 22,
}
// 会报错:Cannot assign to 'name' because it is a read-only property
person.name = 'Lily'
readonly只读, 被readonly标记的属性只能在声明时或类的构造函数中赋值,之后将不可改(即只读属性)。
只读数组 ReadonlyArray
定义:用于将 T 类型的数组设置为只读状态。只能在数组初始化时为变量赋值,之后数组无法修改。
用法:
可选类型 Partial
定义:用于将 T 类型的所有属性设置为可选状态,首先通过 keyof T,取出类型 T 的所有属性,然后通过 in 操作符进行遍历,最后在属性后加上 ?,将属性变为可选属性。
用法:
必选类型 Required
定义:和 Partial<T> 作用相反,用于将 T 类型的所有属性设置为必选状态,首先通过 keyof T,取出类型 T 的所有属性, 然后通过 in 操作符进行遍历,最后在属性后的 ? 前加上 -,将属性变为必选属性。
用法:
提取属性 Pick
定义:从 T 类型中提取部分属性,作为新的返回类型。
用法:
排除属性 Omit
定义:和 Pick 作用相反,用于从 T 类型中,排除部分属性,然后返回一个新类型。
用法:
Omit 推导过程:
摘取类型 Extract<T,U>
定义:提取 T 中可以赋值给 U 的类型。
用法:
排除类型 Exclude<T,U>
定义:与 Extract 用法相反,从 T 中剔除可以赋值给 U 的类型。
用法:
属性映射 Record<K,T>
定义:接收两个泛型,K 必须可以是可以赋值给 string | number | symbol 的类型,通过 in 操作符对 K 进行遍历,每一个属性的类型都必须是 T 类型。
Record 是 TypeScript 中一个很实用的范型类型。它需要两个具体的参数类型,Record<K, V> 用于指定一个对象的类型。其中,对象的所有 key 都是 K 类型的,而这些 key 对应的值则都是 V 类型的。如果不使用 Record 类型,可能需要用如下的方法来达到同等的效果:
用法一:将 Person 类型的数组转化成对象映射:
用法二:传递参数时,希望参数是一个对象,但是不确定具体的类型,就可以使用 Record 作为参数类型:
用法三:写一个函数,可以将参数对象中所有的值都转化成对应的数字,保证输入和输出的对象有相同的 key:
然而,需要注意的一点是,在使用联合类型的时候 Record 本身也存在局限性(这一点本身是 TypeScript 的局限性)。还是以上面的 'apple' | 'banana' | 'orange' 为例,如果这么写,那么下面的代码将是错误的:
Record 天然并不能解决可选 key 的情况。Record<'A' | 'B', number> 的含义是 A 和 B 都需要是这个类型的 key,而不是说只需要有 A 或 B 一个做 key 就可以了。对于这种需要可选的情况,可以再套上一层 Partial 来满足需求:
不可为空类型 NonNullable
定义:从 T 中剔除 null、undefined、never 类型,不会剔除 void、unknow 类型。
用法:
构造函数参数类型 ConstructorParameters
定义:返回 class 中构造函数参数类型组成的元组类型。
用法:
实例类型 InstanceType
定义:获取 class 构造函数的返回类型。
用法:
函数参数类型 Parameters
定义:获取函数的参数类型组成的元组类型。
用法:
函数返回值类型 ReturnType
定义:获取函数的返回值类型。
使用:
最后更新于
这有帮助吗?