# 工具类

# Partial

将数据转换为可缺省

interface Person {
  name: string
  age: number
}

const p: Partial<Person> =  {}

// 工具类通过泛型转换
type Partial<T> = {
  [P in keyof T]?: T[P] | undefined
}

// 最终转换为
type interFace = {
  name?: string,
  age?: number
}

# Record

const obj: Record<string, number> = {}
// 类似于
type Record <K, T> = {
  [P in K]: T
}

# Pick

取当前类型里的指定类型

type User = {
  id: number
  name: string
  age: number
}
type PickedUser = Pick<User, 'id' | 'name'>

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

// PickedUser = { id: number, name: string }

# Omit

剔除当前类型中的某个类型

type Omit<T, K extends string | number | symbol> = {
  [P in Exclude<keyof T, K>]: T[P]
}

interface Person {
  name: string
  id: number
}

type P = Omit(Person, 'id') // { name: string }

# Exclude

type A = Exculde<'id' | 'age' | 'sex', 'id'> // 'age' | 'sex'

type Ecclude<T extends string | number | symbol, U extends string | number | symbol> = {
  T extedns U ? never : T
}

# Extract

type A = Exculde<'id' | 'age' | 'sex', 'id'> // 'id'
type Ecclude<T extends string | number | symbol, U extends string | number | symbol> = {
  T extedns U ? T : never
}

# InstanceType

type MyInstanceType<T> = T extends new (...args: any[]) => infer P ? P : never

type A = MyinstanceType<Person> // Person 实例

# Parameters

type MyParameters<T> = T extends (..args: infer P) => any ? P : never

type F = MyParameters<(a: number, b: string) => any> // [number, string]

# ReturnType

type MyReturnType<T> = T extends (..args: any[]) => infer P ? P : never

type R = MyReturnType<() => string> // string