ts中常用的操作符
阿新 • • 發佈:2021-12-31
// 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 型別的所有屬性