美文网首页
typescript 之Decorators

typescript 之Decorators

作者: 米诺zuo | 来源:发表于2022-03-11 20:14 被阅读0次

    在tsconfig.json 里compilerOptions中配置

    experimentalDecorators: true
    

    创建一个class Decorators

    function Logger(constructor: Function){
      console.log('this is logger')
    }
    
    @Logger
    class Person {
      name: string = 'max';
    
      constructor(){
        console.log('this is person constructor')
      }
    }
    
    const person = new Person()
    
    

    output:

    "this is logger" 
    "this is person constructor"
    

    Logger 在class定义的时候执行,在创建一个实例前执行。一般第一个字母大写,需要接收参数

    Decorators factory
    function Logger(logString: string){
      return function(constructor: Function){
          console.log(logString)
          console.log(constructor)
      }
    }
    @Logger("Logger-Person")
    class Person {
      name: string = 'max';
      constructor(){
        console.log('this is person constructor')
      }
    }
    const person = new Person()
    

    output

    [LOG]: "Logger-Person" 
    [LOG]: class Person {
        constructor() {
            this.name = 'max';
            console.log('this is person constructor');
        }
    } 
    [LOG]: "this is person constructor" 
    

    插入html代码

    function WithTemplate(template: string, bookId: string){
      return function(constructor: any) {
        const bookEle = document.getElementById(bookId) as HTMLElement
        // new constructor() 实例化
        const p = new constructor();
        console.log(p.name)
        if(bookEle) {
          bookEle.innerHTML = template
        }
      }
    }
    
    @WithTemplate('<h1>it is a book</h1>', 'bookId')
    class Book {
      name = 'good'
      constructor(){
        console.log('this is book')
      }
    }
    const book = new Book()
    

    添加多个Decorators

    function Logger(){
      console.log("logger factory")
      return function(constructor: Function){
          console.log("logger function")
      }
    }
    
    function WithTemplate(){
      console.log("template factory")
      return function(constructor: any) {
        console.log("template function")
      }
    }
    @Logger()
    @WithTemplate()
    class Book {
      constructor(){
        console.log('this is book')
      }
    }
    const book = new Book()
    

    output:

    [LOG]: "logger factory" 
    [LOG]: "template factory" 
    [LOG]: "template function" 
    [LOG]: "logger function" 
    [LOG]: "this is book" 
    

    多个decorators, factory 从外到里运行, function从里到外执行。

    创建一个Property Decorators

    function Log(target:any, propertyName: string){
      console.log(target)
      console.log(propertyName)
    }
    
    class Product {
      @Log
      title: string;
      private _price: number;
    
      constructor(t: string, p: number){
        this.title = t;
        this._price = p
      }
      set price(val: number) {
        if(val > 0) {
          this._price = val
        }else {
          throw new Error('this is invalid')
        }
      }
    
      getPriceWithTax(tax: number) {
        return this._price *( 1+ tax)
      }
    }
    

    相关文章

      网友评论

          本文标题:typescript 之Decorators

          本文链接:https://www.haomeiwen.com/subject/mfvcdrtx.html