typescript的装饰器及封装axios

891 阅读1分钟

全局安装typescript

npm install -g typescript

初始化ts环境

tsc --init

生成tsconfig.json文件,并把文件中的两行注释打开

"experimentalDecorators": true,                   /* Enable experimental support for TC39 stage 2 draft decorators. */
"emitDecoratorMetadata": true,                    /* Emit design-type metadata for decorated declarations in source files. */

类装饰器

装饰器和元数据都是实验特性,他俩密切相关,使用tsc -w可以编译成js文件,下面是类装饰器举例,其中TestDecorator和decorator是两个类装饰器,decorator装饰器给类Test添加了一个message方法,可以接受到string类型的参数。

function TestDecorator(target: Function) {
    console.log('test decorator')
}

const decorator: ClassDecorator = (target: Function) => {
    target.prototype.message = (content:string): void => {
        console.log('装饰器中message:'+content)
    }
}

@TestDecorator
@decorator
class Test {

}

const test:any = new Test()
test.message('传递的消息')

这里的输出结果为:

PS D:\project\ts> node index.js
test decorator
装饰器中message:传递的消息
PS D:\project\ts>

方法装饰器

//第一个参数原型对象/构造函数,第二个参数方法的名称,第三个参数方法的描述
const funDecorator:MethodDecorator=(target: Object, propertyKey: string | symbol, descriptor: PropertyDescriptor)=>{
    descriptor.value=()=>{
        console.log('打印系列参数')
        console.log(target)
        console.log(propertyKey)
        console.log(descriptor)
    }
}

class FunClass{
    @funDecorator
    public testFun(){

    }
}

const funClass:any=new FunClass();
funClass.testFun()

打印结果为:

PS D:\project\ts> node index.js
打印系列参数
{}
testFun
{
  value: [Function (anonymous)],
  writable: true,
  enumerable: false,
  configurable: true
}
PS D:\project\ts>

其中writable是说明是否可以重写,意思是类的实例是否可以覆盖这个方法,如果为false,就是不可以覆盖这个方法