自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

【前端】你好,我叫TypeScript (五)裝飾器

開發(fā) 前端
裝飾器是一種特殊類型的聲明,它能夠被附加到類聲明,方法,訪問符,屬性和參數(shù)上,裝飾器是一個表達式,表達式被執(zhí)行后,返回一個函數(shù)。

[[406096]]

1.什么是裝飾器

裝飾器是一種特殊類型的聲明,它能夠被附加到類聲明,方法,訪問符,屬性和參數(shù)上。

  • 裝飾器是一個表達式
  • 表達式被執(zhí)行后,返回一個函數(shù)
  • 函數(shù)的輸入?yún)?shù)為:target,name和descriptor
  • 執(zhí)行函數(shù)后,可能返回descriptor對象,用于配置target對象

裝飾器使用@expression形式,expression求值后必須返回一個函數(shù),他會在運行時被調(diào)用,被裝飾的聲明信息作為參數(shù)傳入。

例如:

  1. // 定義裝飾器 
  2. function testDecorator(target: anykey: string): void { 
  3.   console.log("Target: ", target ); 
  4.   console.log("key: "key); 
  5.  
  6. // 使用裝飾器 
  7. class Boat{ 
  8.   color: string = "yellow"
  9.  
  10.   get formattedColor(): string{ 
  11.     return  `this boat color is ${this.color}`; 
  12.      
  13.   } 
  14.    
  15.   @testDecorator 
  16.   pilot(): void{ 
  17.     console.log("swish"); 
  18.      
  19.   } 
  20.  
  21. // 實例化 
  22. const boat = new Boat(); 
  23. boat.pilot(); 
  24. console.log(boat.formattedColor); 

運行得到:

  1. Target:  {} 
  2. key:  pilot 
  3. swish 
  4. this boat color is yellow 

2.裝飾器分類

裝飾器根據(jù)其所裝飾的類型分為以下一種:

  • 類裝飾器
  • 屬性裝飾器
  • 方法裝飾器
  • 參數(shù)裝飾器

若要啟用實驗性的裝飾器特性,你必須在命令行或tsconfig.json里啟用experimentalDecorators編譯器選項:

命令行:

  1. tsc --target ES5 --experimentalDecorators 

tsconfig.json:

  1.     "compilerOptions": { 
  2.         "target""ES5"
  3.         "experimentalDecorators"true 
  4.     }     

2.1 類裝飾器

類裝飾器用于類構(gòu)造函數(shù),進行監(jiān)聽、修改或替換類定義,在類聲明之前進行聲明(緊挨著類聲明)。

切記:

  • 類裝飾器不能用在聲明文件中(.d.ts),也不能用在任何外部上下文中。
  • 類裝飾器表達式會在運行時當作函數(shù)被調(diào)用,類的構(gòu)造函數(shù)作為其唯一的參數(shù)。
  • 如果類裝飾器返回一個值,它會使用提供的構(gòu)造函數(shù)來替換類的聲明。
  • 如果你要返回一個新的構(gòu)造函數(shù),你必須注意處理好原來的原型鏈。在運行時的裝飾器調(diào)用邏輯中不會為你做這些。

類裝飾器聲明:

  1. declare  type ClassDecorator = <TFunction extends Function>( 
  2.   target: TFunction 
  3. )=>TFunction | void; 

類裝飾器顧名思義,就是⽤來裝飾類的。它接收⼀個參數(shù):

  • target: TFunction - 被裝飾的類

栗子:

  1. // 類裝飾器 
  2. function classDecorator(constructor: typeof Boat){ 
  3.   console.log(constructor); 
  4.    
  5.  
  6. // 使用類裝飾器 
  7. @classDecorator 
  8. class Boat{ 
  9.  

運行結(jié)果:

  1. [class Boat] 

2.2 方法裝飾器

方法裝飾器用于方法的屬性描述符,可以進行監(jiān)聽、修改或替換方法定義,在待修飾方法聲明前進行聲明。方法裝飾器不能用在聲明文件(.d.ts),重載或者任何外部上下文中。

方法裝飾器表達式會在運行時當作函數(shù)被調(diào)用,傳入下列3個參數(shù):

  • target:被裝飾的類
  • key: 方法名
  • descriptor: 屬性描述符

「注意:如果代碼輸出目標版本小于ES5,屬性描述符將會是undefined?!?/p>

如果方法裝飾器返回一個值,它會被用作方法的屬性描述符。

舉個栗子:

  1. // 定義裝飾器 
  2. function testDecorator(target: anykey: string): void { 
  3.   console.log("Target: ", target ); 
  4.   console.log("key: "key); 
  5.  
  6. function logError(errorMessage: string){ 
  7.   return function(target: anykey: string, desc: PropertyDescriptor){ 
  8.     const method = desc.value; 
  9.     desc.value = function(){ 
  10.       try { 
  11.         method(); 
  12.       }catch(err){ 
  13.         console.log(errorMessage); 
  14.          
  15.       } 
  16.     } 
  17.   } 
  18.  
  19. // 使用裝飾器 
  20. class Boat{ 
  21.   color: string = "yellow"
  22.  
  23.   @testDecorator 
  24.   get formattedColor(): string{ 
  25.     return  `this boat color is ${this.color}`; 
  26.      
  27.   } 
  28.  
  29.   @logError("Oops boat was sunk in ocean"
  30.   pilot(): void{ 
  31.     throw new Error() 
  32.     console.log("swish"); 
  33.      
  34.   } 
  35.  
  36. // 實例化 
  37. const boat = new Boat(); 
  38. boat.pilot(); 

運行得到:

  1. Target:  {} 
  2. key:  formattedColor 
  3. Oops boat was sunk in ocean 

2.3 屬性裝飾器

屬性裝飾器屬性描述符只能用來監(jiān)視類中是否聲明了某個名字的屬性,在屬性聲明前進行聲明。

屬性裝飾器表達式會在運行時當做函數(shù)進行調(diào)用,傳入兩個參數(shù):

  • target: 被裝飾的類
  • key: 被裝飾類的屬性名字

注意:屬性描述符不作為參數(shù)傳入屬性裝飾器。因為目前還沒有辦法在定義一個原型對象時描述一個實例屬性,并且沒有辦法進行建議監(jiān)聽或修改一個屬性的初始化方法。

  1. // 定義裝飾器 
  2. function testDecorator(target: anykey: string): void { 
  3.   console.log("Target: ", target ); 
  4.   console.log("key: "key); 
  5.  
  6. function logError(errorMessage: string){ 
  7.   return function(target: anykey: string, desc: PropertyDescriptor){ 
  8.     const method = desc.value; 
  9.     desc.value = function(){ 
  10.       try { 
  11.         method(); 
  12.       }catch(err){ 
  13.         console.log(errorMessage); 
  14.          
  15.       } 
  16.     } 
  17.   } 
  18.  
  19. // 使用裝飾器 
  20. class Boat{ 
  21.   @testDecorator 
  22.   color: string = "yellow"
  23.  
  24.   // @testDecorator 
  25.   get formattedColor(): string{ 
  26.     return  `this boat color is ${this.color}`; 
  27.      
  28.   } 
  29.  
  30.   @logError("Oops boat was sunk in ocean"
  31.   pilot(): void{ 
  32.     throw new Error() 
  33.     console.log("swish"); 
  34.      
  35.   } 

運行結(jié)果:

  1. Target:  {} 
  2. key:  color 

2.4 參數(shù)裝飾器

參數(shù)裝飾器用于類構(gòu)造函數(shù)或方法聲明。接收三個參數(shù):

  • target: 被裝飾的類
  • key:方法名
  • index:方法中的參數(shù)索引值
  1. // 定義裝飾器 
  2. function testDecorator(target: anykey: string): void { 
  3.   console.log("Target: ", target ); 
  4.   console.log("key: "key); 
  5.  
  6. function logError(errorMessage: string){ 
  7.   return function(target: anykey: string, desc: PropertyDescriptor){ 
  8.     const method = desc.value; 
  9.     desc.value = function(){ 
  10.       try { 
  11.         method(); 
  12.       }catch(err){ 
  13.         console.log(errorMessage); 
  14.          
  15.       } 
  16.     } 
  17.   } 
  18.  
  19. // 參數(shù)裝飾器 
  20. function parameterDecorator(target: anykey: string, index: number){ 
  21.   console.log(keyindex); 
  22.    
  23.  
  24. // 使用裝飾器 
  25. class Boat{ 
  26.   @testDecorator 
  27.   color: string = "yellow"
  28.  
  29.   // @testDecorator 
  30.   get formattedColor(): string{ 
  31.     return  `this boat color is ${this.color}`; 
  32.      
  33.   } 
  34.  
  35.   @logError("Oops boat was sunk in ocean"
  36.   pilot(): void{ 
  37.     throw new Error() 
  38.     console.log("swish"); 
  39.      
  40.   } 
  41.  
  42.  
  43.   fast( 
  44.     @parameterDecorator speed: string, 
  45.     @parameterDecorator generateWake: boolean 
  46.   ): void{ 
  47.     if(speed === "fast"){ 
  48.       console.log("swish"); 
  49.     }else
  50.       console.log("nothing"); 
  51.        
  52.     } 
  53.   } 

運行結(jié)果:

  1. Target:  {} 
  2. key:  color 
  3. fast 1 
  4. fast 0 

小結(jié)

我們看到裝飾器很方便為我們結(jié)果了許多問題。裝飾器根據(jù)其裝飾的對象不同,分為:類裝飾器、屬性裝飾器、方法裝飾器、參數(shù)裝飾器。

 

責任編輯:姜華 來源: 前端萬有引力
相關(guān)推薦

2021-05-18 07:37:18

前端TypeScript數(shù)據(jù)類型

2021-05-19 07:35:53

TypeScript變量和接口前端

2021-05-20 07:31:25

TypeScript前端數(shù)據(jù)類型

2021-05-25 07:39:18

TypeScript 前端函數(shù)與類

2024-02-26 00:00:00

TypeScript裝飾器decorators

2023-08-07 16:07:42

2022-09-26 09:02:54

TS 裝飾器TypeScript

2022-05-10 09:12:16

TypeScript裝飾器

2021-10-14 14:00:44

996加班工作

2025-04-07 04:00:00

AngularTypeScript裝飾器

2021-02-20 13:55:35

程序員計算機技術(shù)

2022-01-19 08:21:12

設(shè)計裝飾器模式

2022-03-07 05:53:41

線程CPU代碼

2020-08-04 11:35:38

Vue前端裝飾器

2022-10-18 07:17:31

2021-05-11 09:27:54

裝飾器模式代碼開發(fā)

2021-02-18 15:43:37

Python裝飾器Decorator

2010-02-01 17:50:32

Python裝飾器

2019-11-26 08:56:32

聯(lián)通攜號通信

2023-02-07 07:47:52

Python裝飾器函數(shù)
點贊
收藏

51CTO技術(shù)棧公眾號