Appearance
内置工具类型
Partial
Partial<T> 将类型的属性变成可选,只处理第一层数据
js
type Partial<T> = {
[P in keyof T]?: T[P];
};js
interface UserInfo {
id: string;
name: string;
}
type NewUserInfo = Partial<UserInfo>
/*
interface NewUserInfo {
id?: string;
name?: string;
}
*/DeepPartial
DeepPartial<T> 将类型的属性变成可选,会递归处理
js
type DeepPartial<T> = {
// 如果是 object,则递归类型
[U in keyof T]?: T[U] extends object
? DeepPartial<T[U]>
: T[U]
};Required
Required:类型属性变成必选
js
type Required<T> = {
[P in keyof T]-?: T[P]
};-?:代表移除 ?(可选)
Readonly
Readonly:属性添加只读,引用类型仍然可以改
js
type Readonly<T> = {
readonly [P in keyof T]: T[P];
};Pick
Pick:从某个类型中挑出一些属性出来
js
type Pick<T, K extends keyof T> = {
[P in K]: T[P];
};js
interface Todo {
title: string;
description: string;
completed: boolean;
}
type TodoPreview = Pick<Todo, 'title' | 'completed'>
/*
interface TodoPreview {
title: string;
completed: boolean;
}
*/Record
Record<K extends keyof any, T> :将 K 中所有的属性的值转化为 T 类型。
K extends keyof any:表示 K 为索引类型
keyof any :string | number | symbol
js
type Record<K extends keyof any, T> = {
[P in K]: T;
};js
interface PageInfo {
title: string;
}
type Page = 'home' | 'about' | 'contact'
const x: Record<Page, PageInfo> = {
about: {
title: 'about'
},
contact: {
title: 'contact'
},
home: {
title: 'home'
}
}
/*
interface Page {
home: PageInfo;
about: PageInfo;
contact: PageInfo;
}
*/ReturnType
ReturnType:获取函数返回值类型
js
type ReturnType<T extends (...args: any[]) => any> = T extends (
...args: any[]
) => infer R
? R
: any;infer R:推断返回值类型。T 是函数,返回函数返回值类型,否则返回 any
Exclude
Exclude<T, U> :将 T 类型中属于 U 类型的移除掉
js
type Exclude<T, U> = T extends U ? never : T;js
type T0 = Exclude<'a' | 'b' | 'c', 'a'> // "b" | "c"
type T1 = Exclude<'a' | 'b' | 'c', 'a' | 'b'> // "c"
type T2 = Exclude<string | number | (() => void), Function> // string | numberExtract
Extract<T, U>:将 T 类型 从 U 类型中取出
js
type Extract<T, U> = T extends U ? T : never;js
type T0 = Extract<'a' | 'b' | 'c', 'a' | 'f'> // "a"
type T1 = Extract<string | number | (() => void), Function> // () =>voidOmit
Omit<T, K extends keyof any> :使用 T 类型中除了 K 类型的所有属性,来构造一个新的类型。
js
type Omit<T, K extends keyof any> = Pick<T, Exclude<keyof T, K>>;js
interface Todo {
title: string;
description: string;
completed: boolean;
}
type TodoPreview = Omit<Todo, 'description'>
interface TodoPreview {
title: string;
completed: boolean;
}NonNullable
NonNullable<T> :用来过滤类型中的 null 及 undefined 类型。
js
type NonNullable<T> = T extends null | undefined ? never : T;js
type T0 = NonNullable<string | number | undefined> // string | number
type T1 = NonNullable<string[] | null | undefined> // string[]Parameters
Parameters<T> :获得函数的参数类型组成的元组类型。
js
type Parameters<T extends (...args: any) => any> = T extends (...args: infer P) => any
? P : never;js
type A = Parameters<() => void> // []
type B = Parameters<typeof Array.isArray> // [any]
type C = Parameters<typeof parseInt> // [string, (number | undefined)?]
type D = Parameters<typeof Math.max> // number[]