TypeScript中内置的工具类型

149 阅读2分钟

TypeScript中内置的工具类型

Record

将对象属性的值转换为 T 类型
Record<K extends keyof any, T>

type Property = 'user1' | 'user2'
type User = Record<Property, string>
let user: User = {
    user1: '',
    user2: ''
}

Readonly

将对象或者数组的属性转换成只读的
Record<K extends keyof any, T>

interface User {
    name: string
    age: number
    gender?: string
}

let u: User = {
    name: 'name',
    age: 20
}
u.name = 'new name' // 没有使用 Readonly,可以正常给变量属性赋值

let u: Readonly<User> = {
    name: 'name',
    age: 20
}
u.name = 'new name' // 使用 Readonly 之后,给变量属性赋值就会报错,error:'无法为“name”赋值,因为它是只读属性'

Required

将类型的所有属性变成必选

interface User {
    name: string
    age: number
    gender?: string
}

// 使用 Required 之后会报错,因为他将属性 "gender" 变成必选
// error:类型 "{ name: string; age: number; }" 中缺少属性 "gender",但类型 "Required<User>" 中需要该属性。
let u: Required<User> = {
    name: 'name',
    age: 20,
}

Partial

与 Required 相反,Partial 将类型的所有属性变成可选

interface User {
    name: string
    age: number
    gender: string
}

 // 正常情况下我们这样写,会提示缺少必要的属性"gender"
let u: User = {
    name: 'name',
    age: 20,
}

// 使用 Partial 后,User类型的所有属性变成可选
let u: Partial<User> = {
    name: 'name',
    age: 20,
}

Extract

提取联合类型中的某些类型
Extract< T, U > 表示从 T 中提取 U

type Ex = string | number
// 从联合类型Ex中,提取 string 类型
type U = Extract<Ex, string>  // string
let u: U = '字符串'

Exclude

从联合类型中移除某些类型
Exclude<T,U> 表示从 T 中移除 U

type Ex = string | number
// 从联合类型Ex中,移除 number 类型
type U = Exclude<Ex, number>  // string
let u: U = '字符串'

Pick

从类型中挑出一些属性

interface User {
    name: string
    age: number
    gender: string
}
type U = Pick<User, 'name' | 'age'> // { name: string; age: number }
let user: U = {
    name: 'name',
    age: 22
}

Omit

从类型中移除一些属性

interface User {
    name: string
    age: number
    gender: string
}
type U = Omit<User, 'name' | 'age'> // { gender: string }
let user: U = {
    gender: '男'
}

NonNullable

去除类型中的 null 和 undefined

type U = NonNullable<string | number[] | null | undefined> // string | number[]

ReturnType

获取函数的返回值类型

interface User {
    name: string
}
type Func = (a: string) => User
type U = ReturnType<Func>  // U = User
let u: U = {
    name: '字符串'
}