《九》TypeScript 中的内置工具

news/2024/11/29 22:29:44/

TypeScript 内置了很多类型工具,来辅助进行类型转换。

Partial<Type>

Partial<Type>:用于构造一个所有属性都为可选属性的类型。

interface IPerson {name: stringage: number
}// personOptional 类型的所有属性都是可选的
type personOptional = Partial<IPerson>

请添加图片描述

实现:

type customPartial<T> = {[P in keyof T]?: T[P],
}

Required<Type>

Required<Type>:用于构造一个所有属性都为必选属性的类型。

interface IPerson {name?: stringage?: number
}// personRequired 类型的所有属性都是必选的
type personRequired = Required<IPerson>

实现:

type customRequired<T> = {[P in keyof T]-?: T[P],
}

Readonly<Type>

Readonly<Type>:用于构造一个所有属性都只读的类型。

interface IPerson {name: stringage: number
}// personReadonly 类型的所有属性都是只读的
type personReadonly = Readonly<IPerson>

实现:

type customReadonly<T> = {readonly [P in keyof T]: T[P],
}

Record(KeysType, ValueType)

Record(keys, type):用于构造一个对象类型,依次遍历 KeysType 类型生成对象的 key 的类型,value 都是 ValueType 类型。

type cityNameType = '广州' | '深圳'
type cityDetailType = {address: string, feature: string[],
}
type cityType = Record<cityNameType, cityDetailType>let city:cityType = {'广州':  {address: '广东省', feature: ['包容'],},'深圳':  {address: '广东省', feature: ['现代化'],},
}

请添加图片描述

实现:

keyof any 是 TypeScript 提供的语法,是 string | number| symbol 的联合类型,是对象属性的类型。
请添加图片描述

type customRecord<K extends keyof any, T> = {[P in K]: T
}

Pick<Type, Keys>

Pick<Type, Keys>:用于从 Type 中挑选出 keys 属性来构造出一个类型。

interface IPerson {name: stringage: numberheight: number
}type personPick = Pick<IPerson, 'name' | 'height'>

请添加图片描述

实现:

type customPick<T, K extends keyof T> = {[P in K]: T[P]
}

Omit<Type, Keys>

Omit<Type, Keys>:用于从 Type 中过滤掉 keys 属性来构造出一个类型。

interface IPerson {name: stringage: numberheight: number
}type personOmit = Omit<IPerson, 'age'>

请添加图片描述

实现:

type customOmit<T, K extends keyof T> = {// ((P in keyof T) as P) extends K ? never : P。如果 P 是 T 的 key 的话,就将其作为 P,然后判断是否继承自 K,是的话返回 P,否则返回 never[P in keyof T as P extends K ? never : P]: T[P]
}

Exclude<UnionType, ExcludedTypes>

Exclude<UnionType, ExcludedMembers>:用于构造一个从 UnionType 联合类型中排除了 ExcludedTypes 的类型。

type IDType = string | number | booleantype IDExclude = Exclude<IDType,  number | boolean>

在这里插入图片描述

实现:

type customExclude<T, E> = T extends E ? never : T

Extract<UnionType, ExtractTypes>

Exclude<UnionType, ExcludedMembers>:用于构造一个从 UnionType 联合类型中提取 ExtractTypes 的类型。

type IDType = string | number | booleantype IDExtract = Extract<IDType,  number | boolean>

请添加图片描述

实现:

type customExtract<T, E> = T extends E ?  T : never

NonNullable<Type>

NonNullable<Type>:用于构造一个从 Type 中剔除了null、undefined 类型的类型。

type IDType = string | number | null | undefinedtype IDExclude = NonNullable<IDType>

请添加图片描述

实现:

type customNonNullable<T> = T extends null | undefined ? never : T

ReturnType<Type>

ReturnType<Type>:用于构造一个从函数类型中提取出来的其返回值的类型。

type fnType = (...args: string[]) => numbertype fnReturnType = ReturnType<fnType>

请添加图片描述

实现:

// 此处用到了条件类型中的类型推断,去推断返回值的类型
type customReturnType<T> = T extends (...args: any[])=>infer R ? R : never

InstanceType<Type>

InstanceType<Type>:用于构造一个从构造函数类型中提取出来的的其实例的类型。

class Person {}// typeof Person 获取到构造函数的类型;InstanceType 获取到构造函数的实例的类型
type pType = InstanceType<typeof Person>
const p: pType = new Person()

实现:

// 此处用到了条件类型中的类型推断,去推断返回值的类型
type customReturnType<T> = T extends new (...args: any[])=>infer R ? R : never

http://www.ppmy.cn/news/661081.html

相关文章

这几天系统总是在慢慢地推几天前写的问答

这几天系统总是在慢慢地推几天前写的问答&#xff0c;一天给个几万展现&#xff0c;就怕给多了浪费了。 难道是前几天给得太多&#xff0c;没人读&#xff0c;头条发现了&#xff0c;所以才一点点给&#xff1f; 已经好久没有爆款的感觉了[捂脸] 其实也不怪头条不给流量&#x…

慢慢开始创作吧

认真学习java技术的第一天&#xff0c;贵在坚持&#xff0c;一步一步来吧。

好好生活 慢慢期待

我从未真正忘记过你&#xff0c;你永远是我青春序列里最勇敢的篇章。

一个人慢慢变好的5个征兆

【夜读】一个人慢慢变好的5个征兆 人民日报 2022-11-29 22:04 发表于北京 日复一日的努力 通往梦想最快的方法&#xff0c;是脚踏实地&#xff0c;付出别人不愿付出的努力&#xff0c;攻克别人难以攻克的难题。在默默耕耘的日子里&#xff0c;不妨想想自己想要守护的人和想要…

一切慢慢来。

在学校进不了年纪排名前50但在乌鲁木齐能进真的很高兴。

我感觉正在进步

这周我又因为马虎而没有完成项目任务&#xff0c;在更改示例的时候我没有对更改的地方进行测试&#xff0c;这导致我提交的代码是功能不全的&#xff0c;还好汪总很细心的才找出这个错误&#xff0c;要是流转到客户手上那将造成十分严重的后果&#xff0c;上次也是因为我的马虎…

2022年度总结——一切都在慢慢变好

人生天地之间&#xff0c;若白驹过隙&#xff0c;忽然而已&#xff0c;每个人都希望留下自己的足迹。——题记 日月两盏灯&#xff0c;春秋一场梦。 回想一年前的现在我在干什么呢&#xff1f;去年的寒假我刚步入大学一个学期&#xff0c;迷茫彷徨&#xff0c;怅然若失&#xf…