TS (Record、Partial 、 Required 、 Readonly、 Pick 、 Exclude 、 Extract 、 Omit)常用的工具类型的使用

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?: number
}

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 中的 K 属性是只读的,K 属性是不可修改的。

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[P];
};

作用:生成一个新类型,该类型拥有 T 中的 K 属性集 ; 新类型 相当于 TK 的交集

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

const todo: Bar= {
   age?: 3,
   gender:};
console.log(todo)

Exclude

源码:

type Exclude<T, U> = T extends U ? never : T
1
作用:如果 TU 的子类型则返回 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 = Extract<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 中排除掉 nullundefined

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>
1
作用:获得构造函数返回值的类型

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;
}
*/
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值