1. 程式人生 > 其它 >ts中常用的操作符

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 型別的所有屬性