泛型工具

复制代码
// 泛型工具
interface user {
  name: string
  age: number
  sex: string
}
interface rUser {
  name?: string
  age?: number
  sex?: string
}

// Partial<泛型> 把所有属性改为可选属性
type PUser = Partial<user>
// {
//   name?: string
//   age?: number
//   sex?: string
// }
// 源码
// type CustomPartial<T>  = {
//   [p in keyof T]?: T[p]
// }
// type PUser = CustomPartial<user>

// Required<泛型>把所有属性改为必选属性
type RUser = Required<rUser>
// {
//   name: string
//   age: number
//   sex: string
// }
// 源码,-?代表减去可选....
// type CustomRequired<T> = {
//   [p in keyof T]-?: T[p]
// }
// type RUser = Required<rUser>

// Pick<interface,选中的属性>,取属性出来
// type CustomPick = Pick<user, 'age'>
// {
//   age: number
// }
// 可接受联合类型
type pickUser = Pick<user, 'age' | 'name'>
// {
//   age: number
//   name: string
// }
// 源码,传入K
// type CustomPick<T, K extends keyof T> = {
//   [p in K]: T[p]
// }
// type pickUser = CustomPick<user, 'age' | 'name'>

// Exclude<类型,需要排除的类型>,取被排除后的类型
// type excludeUser = Exclude<'a'|'b'|'c','a'>
// 'b'|'c'
// 可接受联合类型
type excludeUser = Exclude<'a'|'b'|'c','a'|'c'>
// 'b'
// 源码,T属于K的返回nerve,never在联合类中自动会去除
// type CustomExclude<T,K> = T extends K ? never : T
// type excludeUser = CustomExclude<'a'|'b'|'c','a'|'c'>

// Omit跟exclude差不多,不同的是Omit传入的是interface,Omit<interface,需要排除的属性>
type omitUser = Omit<user, 'age'>
// {
//   name: string
//   sex: string
// }
// 可接受联合类型
// type omitUser = Omit<user,'age' | 'sex'>
// {
//   name: string
// }
// type CutomOmit<T, K extends keyof T> = Pick<T,Exclude<keyof T, K>>
// type omitUser = CutomOmit<user, 'age'>

// Record是约束对象的key和value,
// key是要求必须全部要存在、并且只能是number、string、symbol类型
// value不要求全部存在,但是只可以是定义的值
type key = 'a'| 'b'
type value = '跳舞' | '唱歌'
// const obj:Record<key,value> = {
//   'a': '唱歌',
//   'b': '唱歌'
// }
// 可以嵌套
const obj:Record<key,Record<key,value>> = {
  'a': {
    'a': '唱歌',
    'b': '跳舞'
  },
  'b': {
    'a': '唱歌',
    'b': '唱歌'
  }
}
// 源码 
// type normal = keyof any // 会推断为 string、number、symbol
// type customRecord<T extends normal,K> = {
//   [p in T]: K
// }
// const obj:customRecord<key,customRecord<key,value>> = {
//   'a': {
//     'a': '唱歌',
//     'b': '跳舞'
//   },
//   'b': {
//     'a': '唱歌',
//     'b': '唱歌'
//   }
// }

// ReturnType是获取函数的返回值类型
const fn = () => [1, 2, 3, '222']
type rt = ReturnType<typeof fn>
// (string | number)[]
// 源码
// 1.T接受的是函数类型
// 2.函数返回值推断有值则是返回该值,没有的话是never
type CustomReturnType<T extends Function> = T extends (...arg:any[]) => infer Res ? Res : never
复制代码

 

posted on   ChoZ  阅读(4)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示