ts中常用的操作符

// typeof 检查获取变量的声明或者获取类型
// 用法1 检查获取变量的声明
interface People {
  name: string,
  age: number,
}
const me: People = {name: 'xxx', age: 25}
type V = typeof me // =>People
// 用法2 获取类型
function numberArr(x:number):number[] {
  return [x]
}
type fn = typeof numberArr // (x:number) => number[]


// keyof 用来获取某种类型的所有key值,返回的是这些key值的联合类型
// 用法1 遍历一个空数组,获取数组的一些属性或方法
interface Person1 {
  name: string,
  age: number,
}
type key = keyof People[] // "length | toString | pop | push | join | concat"
// 用法2 获取key值
interface Person2 {
  name: string,
  age: number,
}
type key1 = keyof Person2 // name | age
// 用法3
type key2 = keyof {
  [x: string] :Person2
}  // 因为这里的键是索引类型,所以是 string | number


// in 用来遍历枚举类型
type Keys = 'a' | 'b' | 'c'
type obj = {
  [p in Keys]:any
} // {a:any,b:any,c:any}


// infer 在条件类型语句中, 可以用infer声明一个类型变量,并且对它进行使用,返回数组的第一项
// 用法:
type Head<T extends Array<number>> = T extends[head:infer H, ...rest: any[]] ? H:never
type HH = Head<[]> // never
type HH1 = Head<[1]> // 1
type HH2 = Head<[3, 2]> // 3
// 原理是,我们用infer定义一个类型变量为第一项,然后类型收窄,就获得了第一项。


// extends 当我们定义的泛型不想过于灵活,或者想继承某些类的时候,可以通过extends关键字添加泛型约束
// 用法1 只想返回一个有length属性值
interface length {
  length: number
}
function getLength<T extends length>(length: T): T {
  return length
}
getLength('123')
getLength([1,2,3])
getLength({length: 50, name: '12313'})


// Partial 是将某个类型里面的属性全部变成可选,返回的是联合了keyof和in实现的


// Required 是将某个类型的属性全部变为必选,类似Partial


// Readonly 是将某个类型的所有属性变为只读属性,不能重新被赋值


// Record Record<K extends keyof any,T> 的作用是将 K 中所有的属性的值转换为 T 类型


// Pick<T,K extends keyof T> 的作用是将某个类型中的子属性挑出来,变成包含这个类型部分属性的子属性


// Exclude Exclude<T,U> 的作用是将某个类型中属于另一个的类型移除掉


// Omit Omit<T, K extends keyof any> 的作用是使用 T 类型中除了 K 类型的所有属性
posted @ 2021-12-31 18:08  Life_countdown  阅读(477)  评论(0)    收藏  举报