ts-18 進階用法

Proxy & Reflect

  • 概念
    • Proxy
      • es6新增的一個對象攔截器,類似es5的defineProperty。
      • 可以監(jiān)聽到一個對象的變化,取值和設置值,vue3也是通過proxy做的屬性的劫持
    • Reflect
      • 配合Proxy用來操作對象
  • 例子
    •   type Person1 = {
          name: string
          age: number
          sex: string
        }
        const proxy = (obj: any, key: any) => {
          return new Proxy(obj, {
            get(target, prop, receiver) {
              console.log('get', prop)
              return Reflect.get(target, prop, receiver)
            },
            set(target, prop, value, receiver) {
              console.log('set', prop)
              return Reflect.set(target, prop, value, receiver)
            },
          })
        }
      
        // 固定的太死了
        const log1 = (obj: Person1, key: 'name' | 'age' | 'sex') => {
          return proxy(obj, key)
        }
      
        let ps1: Person1 = log1(
          {
            name: '亞索',
            age: 18,
            sex: '男',
          },
          'name'
        )
      
        ps1.name = '瑞雯'
        ps1.sex
        console.log(ps1)
      
        // 優(yōu)化后
        const log2 = <T>(obj: T, key: keyof T): T => {
          return proxy(obj, key)
        }
      
        let ps2 = log2(
          {
            name: '盲僧',
            age: 20,
            sex: '男',
            like: 'hs',
          },
          'like'
        )
      
        ps2.like
      

Partial & Pick

  • 內置高級類型Partial Pick
  • Partial
    •   type Person1 = {
          name: string;
          age: number;
          msg: string;
        };
      
        type p = Partial<Person1>;
      
    • 源碼
      • type Partial<T> = {
          [P in keyof T]?: T[P]
        }
        
      • keyof 什么意思
        • keyof 之后所有的key 都會變成這樣 類似 for in
        • type key = 'name' | 'age' | 'msg';
  • Pick
    • 選取指定一組屬性滥搭,返回一個新的類型定義
    •   type Person1 = {
          name: string;
          age: number;
          msg: string;
        };
      
        type p = Pick<Person, 'name'>
      
    • 源碼
      •   type Pick<T, K extends keyof T> = {
            [P in K]: T[P]
          }
        
      • K extends keyof T 什么意思呢
        • K 我們這傳了個聯(lián)合類型 通過 extends約束了下 你只能傳你的約束的那些值 type key = 'name' | 'age' | 'msg'
        •   type p = Pick<Person, 'xxxx'> // error 
          

Record & Readonly

  • Readonly
    • 類似 Partial
    • 例子
      •   type Person1 = {
            name: string
            age: number
            msg: string
          }
        
          type p1 = Readonly<Person1>
          // p1 會變成這樣
          // type p1 = {
          //     readonly name: string;
          //     readonly age: number;
          //     readonly msg: string;
          // }
        
    • 源碼
      • 也是通過 keyof 把key變成聯(lián)合類型 type key = 'name' | 'age' | 'msg';
      • 然后通過in 遍歷 給每個key 前面添加 readonly
  • Record
    • 例子
      • 用來約束key栽惶,有兩個參數(shù)
      •   type Person1 = {
            name: string
            age: number
            msg: string
          }
        
          type K = 'A' | 'B' | 'C'
        
          type p1 = Record<K, Person1>
        
          // 使用
          let obj3: p1 = {
            A: { name: '亞索', age: 18, msg: '嘻嘻' },
            B: { name: '亞索', age: 18, msg: '嘻嘻' },
            C: { name: '亞索', age: 18, msg: '嘻嘻' },
          }
        
    • 源碼
      •   type Record<K extends keyof any, T> = {
            [P in K]: T
          }
        
      •   // keyof any 什么意思冕象?
          type key = string | number | symbol
        

infer

  • 基礎用法
    • 新增的關鍵字充當占位符
    • 例子
      • 需求:定義一個類型 如果是數(shù)組類型 就返回 數(shù)組元素的類型 否則 就傳入什么類型 就返回什么類型
      • 以前可能會這么寫
        •  type Type<T> = T extends Array<any> ? T[number] : T
          
           type T1 = Type<(number | string)[]>
          
           type T2 = Type<boolean>
          
      • 使用infer
        •  type Type<T> = T extends Array<infer U> ? U : T
          
           type T1 = Type<(number | string)[]>
          
           type T2 = Type<boolean>
          
      • 也可以約束成 never
        •  // 只能傳聯(lián)合類型 不滿足 就返回 never
           type Type<T> = T extends Array<infer U> ? U : never
          
           type T1 = [string, number] // [string, number]
          
           type T2 = Type<boolean> // never
          
          
  • 類型提取
    • 提取頭部元素
      •   type First<T extends any[]> = T extends [infer one, ...any[]] ? one : []
        
          type T1 = First<Arrs> // type a = "a"
        
    • 提取尾部元素
      •   type Last<T extends any[]> = T extends [...any[], infer Last] ? Last : []
        
          type T2 = Last<Arrs> // type b = "c"
        
    • 刪除頭部元素
      •   type Shift<T extends any[]> = T extends [unknown, ...infer Rest] ? Rest : []
        
          type T3 = Shift<Arrs> // type T3 = type T3 = ["b", "c"]
        
    • 刪除尾部元素
      •   type Pop<T extends any[]> = T extends [...infer Rest, unknown] ? Rest : []
        
          type T4 = Pop<Arrs> // type T4 = ["a", "b"]
        
        
  • 遞歸
    • 需求
      •   // 需求 Arr1 正常排序 變成 Arr2 那樣
          type Arr1 = [6, 5, 4, 3, 2, 1]
          type Arr2 = [1, 2, 3, 4, 5, 6]
        
    • 思路
      • 使用泛型約束 只能傳數(shù)組類型
      • 然后提取第一個放入末尾, 循環(huán)操作 形成遞歸 滿足條件 返回
    • 例子
      •   type ReveArr<T extends any[]> = T extends [infer First, ...infer rest]
            ? [...ReveArr<rest>, First]
            : T
        
          type Result = ReveArr<Arr1> // type Result = [1, 2, 3, 4, 5, 6]
        
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末耻讽,一起剝皮案震驚了整個濱河市捐寥,隨后出現(xiàn)的幾起案子握恳,更是在濱河造成了極大的恐慌乡洼,老刑警劉巖束昵,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異术奖,居然都是意外死亡佣耐,警方通過查閱死者的電腦和手機既棺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事答捕。” “怎么了沃琅?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵晌柬,是天一觀的道長。 經(jīng)常有香客問我展鸡,道長,這世上最難降的妖魔是什么莹弊? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任拴竹,我火速辦了婚禮栓拜,結果婚禮上幕与,老公的妹妹穿的比我還像新娘。我一直安慰自己啦鸣,他們只是感情好来氧,可當我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著中狂,像睡著了一般扑毡。 火紅的嫁衣襯著肌膚如雪瞄摊。 梳的紋絲不亂的頭發(fā)上苦掘,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛换淆,可吹牛的內容都是我干的倍试。 我是一名探鬼主播涮母,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼叛本,長吁一口氣:“原來是場噩夢啊……” “哼彤钟!你這毒婦竟也來了?” 一聲冷哼從身側響起营搅,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后狮暑,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體搬男,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年备埃,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片辅搬。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖溶褪,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情于游,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布蚌成,位于F島的核電站,受9級特大地震影響坯癣,放射性物質發(fā)生泄漏惩猫。R本人自食惡果不足惜轧房,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望纤壁。 院中可真熱鬧摄乒,春花似錦、人聲如沸梨水。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至胖笛,卻和暖如春长踊,著一層夾襖步出監(jiān)牢的瞬間辟汰,已是汗流浹背莉擒。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工麦萤, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留壮莹,地道東北人命满。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像韩脏,于是被迫代替她去往敵國和親铸磅。 傳聞我的和親對象是個殘疾皇子吹散,可洞房花燭夜當晚...
    茶點故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內容