美文网首页
typescript装饰器

typescript装饰器

作者: Birdd | 来源:发表于2023-04-03 11:04 被阅读0次

装饰器是一种特殊类型的声明,它能够被附加到类声明,方法, 访问符,属性或参数上。

类装饰器

const classDec: ClassDecorator = (target: Function) => {
  target.prototype.myClassName = "类装饰器";
  target.prototype.getClassName = <T>(params: T, param2: number) => {
    console.log(`我是方法里的${params}${param2}`);
    return params;
  };
};

@classDec
class MyClassD {}

let myClassD = new MyClassD();

// console.log(myClassD)
// console.log((myClassD as any).myClassName)
// console.log((myClassD as any).getClassName(123,'zhang'));

工厂装饰器
其实也就是一个高阶函数 外层的函数接受值 里层的函数最终接受类的构造函数
⭐相同函数名称只执行先注册的

const facDec = (params:string): ClassDecorator => {
  return (fun:Function)=>{
    fun.prototype.say = ()=>{
        console.log(`i say${params}`)
    }
  };
};

@facDec('世界和平')
class MyFacDec{
    say(){

    }
}

let myFacDec = new MyFacDec()
myFacDec.say()

装饰器组合

@watcher2('myYname')
@watcher
class AA {
    constructor() {
 
    }
}
 
const aaTest = new AA();
console.log((aaTest as any).getParams('123wode'));
console.log((aaTest as any).getOptions());

方法装饰器

//普通方法装饰器
const methodDec: MethodDecorator = (
  target,
  propertyKey,
  descriptor: PropertyDescriptor
) => {
  const method = descriptor.value;
  descriptor.value = () => {
    console.log(`重写方法`);
  };
};
//静态方法装饰器
const staticMethodDec: MethodDecorator = (
  target,
  propertyKey,
  descriptor: PropertyDescriptor
) => {
  const method = descriptor.value;
  descriptor.value = () => {
    console.log(`重写静态方法`);
  };
};

class MyMethod {
  @methodDec
  public showMethod() {
    console.log(`来吧展示普通方法`);
  }
  @staticMethodDec
  public static showStaticMethod() {
    console.log(`来吧展示静态方法`);
  }
}

let myMethodD = new MyMethod();

// console.log(myMethodD)
// myMethodD.showMethod()

// MyMethod.showStaticMethod()

属性装饰器

const proDec: PropertyDecorator = (target, propertyKey) => {
  let myvalue: string;
  Object.defineProperty(target, propertyKey, {
    get() {
      return myvalue.toLocaleLowerCase();
    },
    set(v) {
      myvalue = v;
    },
  });
};
class Student {
  @proDec
  public name: string;
  public age: number;
  constructor(n: string, a: number) {
    this.name = n;
    this.age = a;
  }
  say() {
    console.log(`${this.name}age is ${this.age}`);
  }
}

let xiaogang = new Student("ZhAngsan", 19);
// xiaogang.say()
// console.log(xiaogang.name)

元数据

Reflect.defineMetadata("myname", "12", myFacDec,'title');
console.log(Reflect.getMetadata("myname",myFacDec,'title'))

相关文章

  • TypeScript基础入门之装饰器(三)

    转载 TypeScript基础入门之装饰器(三) 继续上篇文章[TypeScript基础入门之装饰器(二)] 访...

  • TS装饰器初体验,用装饰器管理koa接口

    typescript中的装饰器有很多种,比如类装饰器、方法装饰器、属性装饰器等等,先看看装饰器的定义吧,下面以类装...

  • 如何配置React项目直接使用TypeScript包(babel

    上期我们说到了TypeScript装饰器(decorators)和JavaScript装饰器编译出的代码不同,我们...

  • 迁移React项目至TypeScript(babel版)

    上期我们说到了TypeScript装饰器(decorators)和JavaScript装饰器编译出的代码不同,虽然...

  • 【TypeScript】装饰器

    在看VSCODE源码的时候,看到这样一部分代码: 疑惑之际,查看一下官方文档:https://www.tslang...

  • TypeScript装饰器

    装饰器是一种特殊类型的声明,它可以用在类声明、方法、属性或者参数上。顾名思义,它是用来给附着的主体进行装饰,添加额...

  • Typescript装饰器

    装饰器主要用于将一些常用操作进行抽象出一层对类,方法,属性,参数进行修饰的函数。常用例子:设置属性时,打日志等。 ...

  • 装饰器 TypeScript

    装饰器 : 装饰器是一种特殊类型的声名 。它能够被附加到类声明,方法,属性或参数上 , 可以修改类的行为。 通俗的...

  • TypeScript 装饰器

    TypeScript 与 ES6 的装饰器? ES6 的装饰器是一种函数,写成@ + 函数名。它可以放在类和类方法...

  • Typescript 装饰器

    我想绝大多数开发人员都见识过 java 里的 annotation,经典的 @ 图标, 如 @Override: ...

网友评论

      本文标题:typescript装饰器

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