TS 内置utilty 类型

305 阅读2分钟

总结一些常用的 TS 内置类型,包含实现

Pick

字面意思:挑选,就是从一个较大类型中挑选出所需要的字段

使用

    type Person =  {
      name:string,
      age:number
    }
    type Baby  = Pick<Person,"name"> // { name:string}

原理

首先 要限定 K 的范围,只能在 Tkey 值组成的联合类型里面,然后 遍历 K 值

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

Record

使用

字面意思:记录;一个 key 值对应一条 value 数据,key 值只能是 string | number | symbol

 type Person =  {
      name:string,
      age:number
 }
 type O = Record<string,number>
 const obj:O = {
      name: 12,
      password: 12
   };
   // 可以自由添加属性,但是要满足 string:number 这种条件
    obj.sex = 1

    type O1 = Record<"a" | 'b' ,Person>
    let c:O1 = {
       a: { name:'z',age:20 },
       b: { name:'z',age:20 },
    }

原理

keyof any 是 string | number | symbol 组成的联合类型

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

Exclude

使用

字面意思:排除; 从一个大的类型中,排除某些类型,基本上和 Pick 是反义 一般都是总类型放在前面,需要操作的数据放到第二个参数上

// 第一个参数和第二个 都是联合类型
    type Baby  = Exclude<"name" | 'age',"name">
    let c:Baby = "age"

如果想 在 一个 interface 上去除某个 key 值,得到 不带 key值的 interface 可以使用 Omit
不过可以使用 Exclude 模拟一下

// 原理:从一个对象中 排除一个 key 值,然后返回这个对象
// 1.从 Pick 中 挑出 除了 K 子集的参数
// 2. 获取 K 子集的参数
// 使用 {
//    [ P in keyof T]:P extends K ? never :P
// } 获得一个 { name:never,age:number }
//3. 使用 lookup 去除 never 获得 key 值

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

Omit

使用

字面意思:忽略; 从一个大的类型中,忽略某些类型,基本上和 Pick 是反义

type Person =  {
  name:string,
  age:number
}
type Baby  = Omit<Person,"name">
let f:Baby = {
  age:20
}

原理

// 把属于 K 的 排除
type Person =  {
  name:string,
  age:number
}
type MyOmit<T,K extends keyof T> =Pick<T, Exclude<keyof T,K>>
type Baby  = MyOmit<Person,"name"> // { }

Partial

字面意思:部分的,不完全的,所有属性变成可选属性

使用

type Person =  {
  name:string,
  age:number
}
type Baby  = Partial<Person>
let p1:Baby = {
    name:''
} // 可以省略 age

如果想让部分可选的话,可以实现一下 原理就是先把所有属性都变成 可选的 把除了第二个 参数之外的变成 必填的 取他们的交集

type PartialPart <T,K extends keyof T> = Partial<T> & Pick<T,Exclude<keyof T,K>>
type Baby  = PartialPart<Person,"age">
// age 是选填的
let f:Baby = {
  name:''
}

原理

type myPartial <T> = {
// 在  属性后面 加上 ?
  [P in keyof T]?:T[P]
}

Readonly

使用

type Person = Readonly< {
  name:string,
  age:number
}>

let f:Person = {
  name:'',
  age:20
}

f.name ="50" // error 不允许修改

原理

type  myReadOnly <T> = {
  readonly [K in keyof T]: T[K]
}

note:还有很多没写,比如returnType;Parameters;Uppercase;Lowercase;Capitalize 以后有时间补上,date:2022.5.27