应用于类的声明,必须在类声明之前声明

  1. function classDec ( target: new() => any ) {}
  2. @classDec
  3. class ClassName {}
  • 参数说明
    • targer:装饰的类

示例

function addName ( name: string ) {
    return ( target: new() => any ) => {
      target.prototype.name = name
  }
}

@addName('阿坤')
class People {}

类的重载

如果类装饰器返回一个值,这个值会替换掉被装饰类的声明

function classDec ( target: any ) {
    return class{
        ...
    } 
}
  • 被装饰类的声明,会被彻底替换掉,最终只有返回类中的成员

    function classDec ( target: any ) {
      return class extends target {
          ...
      } 
    }
    
  • 可以通过返回类继承被装饰类,保留原本的成员,并进行扩展