TS 几个内置工具类型(Partial & Required & Readonly & Pick & Exclude & Extract & Omit)的使用

4,263 阅读1分钟

Partial

源码:

type Partial<T> = {
    [P in kefof T]?: T[P]
}

作用:生成一个新类型,该类型与 T 拥有相同的属性,但是所有属性皆为可选项

eg:

interface Foo {
    name: string
    age: number
}
type Bar = Partial<Foo>
// 相当于
type Bar = {
    name?: string
    age?: string
}

Required

源码:

type Require<T> = {
    [p in keyof T]-?: T[P]
}

作用:生成一个新类型,该类型与 T 拥有相同的属性,但是所有属性皆为必选项

eg:

interface Foo {
    name: string
    age?: number
}
type Bar = Required<Foo>
// 相当于
type Bar = {
    name: string
    age: string
}

Readonly

源码:

type Require<T> = {
    [p in keyof T]-?: T[P]
}

作用:生成一个新类型,该类型与 T 拥有相同的属性,但是所有属性皆为必选项

eg:

interface Foo {
    name: string
    age: number
}
type Bar = Required<Foo>
// 相当于
type Bar = {
    readonly name: string
    readonly age: string
}

Pick

源码:

type Pick<T, K extends keyof T> = {
    [p in K]: T[K]
}

作用:生成一个新类型,该类型拥有 T 中的 K 属性

eg:

interface Foo {
    name: string
    age?: number
    gender: string
}
type Bar = Pick<Foo, 'age' | 'gender'>
// 相当于
type Bar = {
    age?: string
    gender: string
}

Exclude

源码:

type Exclude<T, U> = T extends U ? never : T

作用:如果 T 是 U 的子类型则返回 never 不是则返回 T

eg:

type A = number | string | boolean
type B = number | boolean

type Foo = Exclude<A, B>
// 相当于
type Foo = string

Extract

源码:

type Extract<T, U> = T extends U ? T : never

作用: 和 Exclude 相反

eg:

type A = number | string | boolean
type B = number | boolean

type Foo = Exclude<A, B>
// 相当于
type Foo = number | boolean

Omit

源码定义:

type Omit<T, K extends keyof any> = Pick<T, Exclude<keyof T, K>> 

作用:生成一个新类型,该类型拥有 T 中除了 K 属性以外的所有属性

eg:

type Foo = {
	name: string
	age: number
}

type Bar = Omit<Foo, 'age'>
// 相当于
type Bar = {
	name: string
}