文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

【前端】你好,我叫TypeScript (五)装饰器

2024-12-03 03:25

关注

装饰器使用@expression形式,expression求值后必须返回一个函数,他会在运行时被调用,被装饰的声明信息作为参数传入。

例如:

  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.装饰器分类

装饰器根据其所装饰的类型分为以下一种:

若要启用实验性的装饰器特性,你必须在命令行或tsconfig.json里启用experimentalDecorators编译器选项:

命令行:

  1. tsc --target ES5 --experimentalDecorators 

tsconfig.json:

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

2.1 类装饰器

类装饰器用于类构造函数,进行监听、修改或替换类定义,在类声明之前进行声明(紧挨着类声明)。

切记:

类装饰器声明:

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

类装饰器顾名思义,就是⽤来装饰类的。它接收⼀个参数:

栗子:

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

运行结果:

  1. [class Boat] 

2.2 方法装饰器

方法装饰器用于方法的属性描述符,可以进行监听、修改或替换方法定义,在待修饰方法声明前进行声明。方法装饰器不能用在声明文件(.d.ts),重载或者任何外部上下文中。

方法装饰器表达式会在运行时当作函数被调用,传入下列3个参数:

「注意:如果代码输出目标版本小于ES5,属性描述符将会是undefined。」

如果方法装饰器返回一个值,它会被用作方法的属性描述符。

举个栗子:

  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 属性装饰器

属性装饰器属性描述符只能用来监视类中是否声明了某个名字的属性,在属性声明前进行声明。

属性装饰器表达式会在运行时当做函数进行调用,传入两个参数:

注意:属性描述符不作为参数传入属性装饰器。因为目前还没有办法在定义一个原型对象时描述一个实例属性,并且没有办法进行建议监听或修改一个属性的初始化方法。

  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.   } 

运行结果:

  1. Target:  {} 
  2. key:  color 

2.4 参数装饰器

参数装饰器用于类构造函数或方法声明。接收三个参数:

  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. 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.   } 

运行结果:

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

小结

我们看到装饰器很方便为我们结果了许多问题。装饰器根据其装饰的对象不同,分为:类装饰器、属性装饰器、方法装饰器、参数装饰器。

 

来源:前端万有引力内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯