`

TypeScript语法基础 - 装饰器

 
阅读更多

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

通俗来讲: 装饰器就是一个方法,可以注入到类,方法,属性参数上来扩展类,属性,方法,参数的功能。

常见的装饰器有: 类装饰器,属性装饰器,方法装饰器,参数装饰器

装饰器的写法: 普通装饰器(无法传参) 装饰器工厂(可传参)

类装饰器

类装饰器: 类装饰器在类声明之前被声明(紧靠着声明) 类装饰器应用于类构造函数,可以用来监视,修改或替换类定义,并传入一个参数

装饰器的执行顺序

属性>方法>方法参数>类 如果有多个同样的装饰器,它会优先执行后面的(从里到外的执行顺序)

 

   1. 类装饰器

a. 普通装饰器(无法传参)

 

function logClass(params:any) {
    //params就是当前类
    console.log(params)// [Function: HttpClient]
    params.prototype.apiUrl='动态扩展属性';
    //扩展动态方法
    params.prototype.run=function(){
        console.log('我是一个run方法');
    }
}

//调用装饰器用@ 普通装饰器无法传参
@logClass
class HttpClient{
    constructor() {}
    getData(){}
}

var http:any=new HttpClient();
console.log(http.apiUrl);//动态扩展属性
http.run();//我是一个run方法

 

 

 

b.装饰器工厂(可传参)

 

function logClass(params:string) {
    return function(target:any){
        console.log(target);//把类 传参给
        target.prototype.apiUrl=params;
    }
}

//调用装饰器用@
@logClass('www.baidu.com')
class HttpClient{
    constructor() {}
    getData(){}
}
var http:any=new HttpClient();
console.log(http.apiUrl);

 

 

c. 类装饰器 重载构造函数的例子

 

/*
类构造器表达式会在运行时当做函数被调用,类的沟站函数作为其唯一的参数。
如果类装饰器返回一个值,它会使用提供的构造函数来替换类的声明。
* */

function logClass(target:any){
    console.log(target);
    return class extends target{
        apiUrl:any='我是修改后的数据';
        getData(){
            this.apiUrl=this.apiUrl+'----';
            console.log(this.apiUrl);
        }
    }
}

@logClass
class HttpClient{
    public apiUrl:string | undefined;
    constructor() {
        this.apiUrl='我是构造函数里面的apiUrl'
    }

    getData(){
        console.log(this.apiUrl);
    }
}
var http=new HttpClient();
http.getData();//我是修改后的数据----

 

 

 

   2. 属性装饰器

/*
属性装饰器表达式会在运行时,当做函数被调用,传入下列两个参数
对于静态成员来说是类的构造函数,对于实例成员是类的原型对象
成员的名字
**/
function logProperty(params:any){
    return function(target:any,attr:any){
        console.log(target) //HttpClient { getData: [Function] }
        console.log(attr) //apiUrl
        target[attr]=params;

    }

}

@logClass('xxxxx')
class HttpClient{
    @logProperty('xxxsssss')
    public apiUrl:string | undefined;
    constructor() {}

    getData(){
        console.log(this.apiUrl)//xxxsssss
    }
}
var http=new HttpClient();
http.getData();//我是修改后的数据----

   3. 方法装饰器

/*
方法装饰器 它会接应应用到方法的属性的描述符上,可以用来监视,修改或者替换方法的定义
方法的装饰会在运行时传入下列3个参数
1.对于静态成员来说是类的构造函数,对于实例成员是类的原型对象
2.成员的名字
3.成员的属性描述符
*/
function logMethod(params:any){
    return function (target:any,methodName:any,desc:any) {
        console.log(target); //HttpClient { getData: [Function] }
        console.log(methodName); //getData
        console.log(desc); // { value: [Function],writable: true, enumerable: true,configurable: true }
        target.apiUrl='mssmmsmsm';
        target.run=function () {
            console.log('run')
        }
    }
}

class HttpClient{
    public url:any | undefined;
    constructor() {}
    @logMethod('xxxx')
    getData(){
        console.log(this.url);
    }
}
var http:any=new HttpClient();
console.log(http.apiUrl);
http.run();

//方法装饰器 修改getData方法
function logMethod(params: any) {
    console.log(params)
    return function (target: any, methodName: any, desc: any) {
        console.log(target); //HttpClient { getData: [Function] }
        console.log(methodName); //getData
        console.log(desc.value); //方法定义
        //修改装饰器的方法,把装饰器方法里面传入的所有参赛改为string类型
        //保存当前的方法
        var oMethods=desc.value;
        //替换
        desc.value=function (...args:any[]) {
            args=args.map((value)=>{
                return String(value)
            })
            console.log(args);
            //修改方法 对象冒充
            oMethods.apply(this,args);
        }
    }
}

class HttpClient {
    public url: any | undefined;
    constructor() {}
    @logMethod('xxxx')
    getData(...args:any[]) {
        console.log(args)
        console.log('我是getData中的方法');
    }
}
var http: any = new HttpClient();
http.getData('123','xxx');//[ '123', 'xxx' ]

   4. 参数装饰器

/*
方法参数装饰器
参数装饰器表达式会在运行时当做函数直接调用,可以使用参数装饰器为类的原型增加一些元素数据,传入下列3个参数
对于静态成员来说是类的构造函数,对于实例成员是类的原型对象。
参数的名字
参数在函数参数列表的索引。
**/
function logParams(params:any) {
    return function (target: any, methodName: any, paramsIndex: any) {
        console.log(params)
        console.log(target);
        console.log(methodName);
        console.log(paramsIndex);
        target.apiUrl=params;
    }
}

class HttpClient {
    public url: any | undefined;
    constructor() {}
    
    getData(@logParams('uuiddddddddd') uuid: any) {
        console.log('我是getData里面的方法')
        console.log(uuid+'----');
    }
}
//实例化
var http:any = new HttpClient();
http.getData(11111)
console.log(http.apiUrl);

 

分享到:
评论

相关推荐

    vue-typescript-admin-template-master_vue_

    - Decorators:TypeScript的装饰器允许在运行时修改类的行为,常用于Vue的组件、属性和方法的元数据定义。 4. HTML5与CSS3 - HTML5的新特性:如语义化标签(header、footer、nav等)、离线存储(localStorage)、...

    Typescript-API-Learning-源码.rar

    5. **装饰器**:装饰器是一种特殊类型的声明,可以被附加到类声明、方法、访问器、属性或参数上,用于在运行时修改或增强这些结构的行为。 6. **类型系统**:TypeScript的类型系统能够捕捉编译时的错误,避免了...

    TypeScript学习案例-贪吃蛇

    9. Decorators(装饰器):虽然不是贪吃蛇游戏的必需部分,但装饰器可以用来增强或修改类、属性和方法的行为,是TypeScript的一个强大特性。 10. 错误处理:TypeScript的异常处理机制可以帮助我们优雅地处理可能...

    藏经阁-现代TypeScript高级教程-103.pdf

    它支持ES6及以上的语法,如箭头函数、类和解构赋值,同时引入了接口、泛型、装饰器等概念,为大型项目提供了更强大的工具。 **二、类型** 类型是 TypeScript 的核心特性,它允许开发者声明变量、函数参数和返回值的...

    week-1-typescript-assignment-brandonbeau:GitHub Classroom创建的week-1-typescript-assignment-brandonbeau

    9. **装饰器(Decorators)**: 装饰器是一种特殊类型的声明,可以被附加到类声明、方法、访问器、属性或参数上,用于修改类的行为或属性。 10. **异步编程**: TypeScript支持Promise和async/await语法,使得异步...

    week-1-typescript-assignment-jsmartin15:GitHub Classroom创建的week-1-typescript-assignment-jsmartin15

    装饰器是一种元编程机制,可以在运行时修改或增强对象的属性和方法。它们通过`@expression`语法应用于类、属性、方法等,用于添加元数据或改变行为。 7. **模块(Modules)** TypeScript支持AMD和CommonJS模块...

    PA_typescript-lab-4

    通过 PA_typescript-lab-4 实验,你不仅能够熟悉 TypeScript 的语法和特性,还能提升实际项目中的应用能力。实践是最好的老师,通过解决实验室提供的挑战,你将更加熟练地掌握 TypeScript 这门强大的语言。

    typescript例子-所有代码打包

    总的来说,“typescript例子-所有代码打包”提供了全面的TypeScript实践,覆盖了类型系统、接口、泛型、函数、类、模块和装饰器等多个方面。通过这些示例,你可以逐步掌握TypeScript的精髓,并将其应用到自己的项目...

    typescript-test-2

    综合以上信息,我们可以推测"typescript-test-2"项目可能包含一系列测试用例,涵盖了TypeScript的各种特性,例如类型检查、接口实现、泛型使用、装饰器应用等,通过这些测试来验证TypeScript代码的正确性、稳定性和...

    Understanding-Typescript-2021-U:Typescprit Udemy课程

    7. **装饰器(Decorators)**:装饰器是一种元编程特性,允许在运行时修改类的行为或属性。它们以 `@decorator` 形式出现,常用于实现依赖注入或提供元数据。 8. **枚举(Enums)**:枚举是 TypeScript 中一种强大...

    typescript-decorator-builder

    标题 "typescript-decorator-builder" 暗示我们即将探讨的是关于 TypeScript 中的装饰器(Decorator)及其构建机制。装饰器是一种特殊类型的声明,可以被附加到类声明、方法、访问器、属性或参数上。它们提供了一种...

    typescript例子-一个照片板的例子

    4. 装饰器(Decorators):装饰器是元编程的一种形式,可以用来修改类的行为或属性。例如,可能会有一个装饰器用于验证上传照片的大小或格式。 5. 静态类型检查:TypeScript的强类型系统会在编译阶段进行类型检查,...

    typescript-react-tutorial

    TypeScript则需要掌握其基本类型、接口、泛型、装饰器等概念。 在本教程中,你可能会接触到以下几个关键知识点: 1. **TypeScript基础知识**:学习如何声明变量的类型,理解基本类型(如string、number、boolean、...

    typescript-for-javascript-developers

    - **装饰器(Decorators)**:允许元编程,用于修改类的行为或属性。 **二、从JavaScript迁移到TypeScript** 1. **代码转换**:将JavaScript代码逐步转换为TypeScript,可以使用`--allowJs`选项让TypeScript编译器...

    typescript-plugin-tw-template:提供编辑器支持带标签模板语法的顺风tw ...

    尽管在编写本文时它不会对未知类发出警告,但该扩展程序提供的所有其他功能(悬停信息,颜色装饰器,更快的速度)都不能弥补它,因此,我强烈建议您使用它代替它。 有关如何使用twin.macro进行配置的详细信息,。 ...

    Typescript-gama-academy:Curso de Typescript da Gama学院

    1. **基础语法**:学习TypeScript的基本语法,包括变量声明(let和const)、数据类型(如字符串、数字、布尔值、数组、对象、null和undefined)、操作符、流程控制语句(如条件语句和循环)等。 2. **类型系统**:...

    typescript-for-javascript-develop

    6. **装饰器(Decorators)**:装饰器是一种元编程机制,可以用来修改类的行为或属性。学习如何定义和使用装饰器,例如用于实现数据验证、日志记录等功能。 7. **类型推断(Type Inference)**:TypeScript可以自动...

    typescript-udemy-practice:Udemy TypeScript练习

    7. **装饰器(Decorators)**:元编程工具,可以添加、修改或删除类的属性和方法。 8. **高级类型(包括联合类型、交叉类型、类型保护等)**:提供了更复杂的类型组合方式,以适应各种复杂场景。 9. **类型推断...

    Typescript-decorator-examples

    **装饰器的基本语法** 装饰器以`@`符号开头,后跟一个函数表达式。这个函数会在编译时被调用,其返回值通常是一个类、属性或方法的修饰器工厂。 ```typescript @decorator class MyClass {} ``` **类装饰器** 类...

    typescript-udemy-2020:具有教育意义的内容

    TypeScript还支持枚举(Enums)、泛型(Generics)、装饰器(Decorators)和模块(Modules)等高级特性。枚举允许创建命名常量集合,而泛型则允许编写可重用的代码,这些代码可以处理多种类型的数据。装饰器提供了一...

Global site tag (gtag.js) - Google Analytics