TS⾥⼏个常⽤的内置⼯具类型(Record、Partial、Required、Readon。。。Record
Record的内部定义,接收两个泛型参数;Record后⾯的泛型就是对象键和值的类型
作⽤ :义⼀个对象的 key 和 value 类型
源码:
Record<key type, value type>
胎教教程Record<string, never> 空对象
Record<string, unknown>任意对象
{} 任何不为空的对象
type Record<K extends string|number|symbol,T>={
[P in K]:T;
}
逐步解析
泛型K即为第⼀次参数
p in xx ⼜是什么意思呢?
in的意思就是遍历,如上就是将 类型string进⾏遍历,也就是string
每个属性都是传⼊的T类型,如 string: PersonModel
Partial
方案英语
源码:
type Partial<T>={
[P in kefof T]?:T[P]
}
作⽤:⽣成⼀个新类型,该类型与 T 拥有相同的属性,但是所有属性皆为可选项
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 拥有相同的属性,但是所有属性皆为必选项
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 拥有相同的属性,但是所有属性皆为必选项
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 属性
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
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 相反
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 属性以外的所有属性
type Foo ={
name: string
age: number
}
type Bar = Omit<Foo,'age'>
// 相当于
type Bar ={
name: string
}
NonNullable
源码定义:
NonNullable<T>
作⽤:从泛型 T 中排除掉 null 和 undefined
type NonNullable<T>=T extends null |undefined? never :T;
type t = NonNullable<'name'|undefined|null>;
/* type t = 'name' */
Parameters
源码定义:
Parameters<T extends(...args: any)=> any>
作⽤:以元组的⽅式获得函数的⼊参类型
type Parameters<T extends(...args: any)=> any>=T extends(...args: infer P)=> any ?P: never;
type t = Parameters<(name: string)=> any>;// type t = [string]
type t2 = Parameters<((name: string)=> any)|((age: number)=> any)>;// type t2 = [string] | [number] ConstructorParameters
源码定义:
ConstructorParameters<T extends new (...args: any)=> any>
作⽤:以元组的⽅式获得构造函数的⼊参类型
type ConstructorParameters<T extends new (...args: any)=> any>=T extends new (...args: infer P)=> any ?P: never; type t = ConstructorParameters<(new(name: string)=> any)|(new(age: number)=> any)>;
// type t = [string] | [number]
ReturnType
源码定义:
ReturnType<T extends(...args: any)=> any>
作⽤:获得函数返回值的类型
type ReturnType<T extends(...args: any)=> any>=T extends(...args: any)=> infer R?R: any;
type t = ReturnType<(name: string)=> string | number>
// type t = string | number
InstanceType
源码定义:
InstanceType<T extends new (...args: any)=> any>
作⽤:获得构造函数返回值的类型
type InstanceType<T extends new (...args: any)=> any>=T extends new (...args: any)=> infer R?R: any;
type t = InstanceType<new(name: string)=>{name: string, age: number}>
/*
type h = {
name: string;
age: number;
}
三里屯地铁*/
总结:
1、重点理解这些内置的⼯具类型的定义。
2、能够以此为参考写⼀些⼯具类型并运⽤到项⽬中去。