《九》TypeScript 中的内置工具

本文介绍了TypeScript中的一些内置类型工具,如Partial用于创建所有属性可选的类型,Required使所有属性变为必选,Readonly创建只读属性的类型。Record用于构建指定键值对的对象类型,而Pick和Omit则分别用于选择和移除对象中的特定属性。此外,还提到了Exclude和Extract用于处理联合类型,NonNullable去除null和undefined,以及ReturnType和InstanceType用于获取函数返回值和类实例的类型。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

Partial<Type>

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

interface IPerson {
  name: string
  age: number
}

// personOptional 类型的所有属性都是可选的
type personOptional = Partial<IPerson>

请添加图片描述

手动实现:

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

Required<Type>

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

interface IPerson {
  name?: string
  age?: number
}

// personRequired 类型的所有属性都是必选的
type personRequired = Required<IPerson>

手动实现:

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

Readonly<Type>

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

interface IPerson {
  name: string
  age: number
}

// personReadonly 类型的所有属性都是只读的
type personReadonly = Readonly<IPerson>

手动实现:

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

Record(KeysType, ValueType)

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

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: string
  age: number
  height: 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: string
  age: number
  height: 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]
}

Extract<UnionType, ExtractTypes>

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

type IDType = string | number | boolean

type IDExtract = Extract<IDType,  number | boolean>

请添加图片描述

手动实现:

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

Exclude<UnionType, ExcludedTypes>

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

type IDType = string | number | boolean

type IDExclude = Exclude<IDType,  number | boolean>

在这里插入图片描述

手动实现:

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

NonNullable<Type>

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

type IDType = string | number | null | undefined

type IDExclude = NonNullable<IDType>

请添加图片描述

手动实现:

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

ReturnType<Type>

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

type fnType = (...args: string[]) => number

type 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值