ts中的装饰器

本文将深入探讨TypeScript中的装饰器概念,解释其工作原理,并通过实例展示如何使用装饰器来增强类、属性、方法和参数的功能。装饰器是一种特殊类型的声明,可以被附加到类声明、方法、访问器、属性或参数上,为元编程提供了一种机制,允许运行时修改类的行为或属性特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、命名空间:----------
    命名空间:namespace 为防止不同程序员之间命名冲突,命名空间里面的类需要export之后外部才能使用。不同模块之间使用命名空间,namespace也需要被export,在对应使用的地方import它
    在低版本中引入的方式是使用三个斜杠,然后写文件夹地址 ///<reference path="A.ts" />,    ts3.0以后的版本通常用import引入 

        export namespace A{
   
   
            export class Test{
   
   
                name:string;
            }
        }
        使用: let a = new A.Test();  不同的命名空间里面的类命名相同相互不影响。


2、装饰器:-------------
    装饰器是一个方法,可以注入到类,方法,属性参数上来扩展类,属性,方法,参数的功能
    常见装饰器:类装饰器,属性装饰器,方法装饰器,参数装饰器。
    装饰器的写法:普通装饰器(无法传参),装饰器工厂(可传参)

1)、类装饰器:类装饰器在类声明之前(紧靠着类声明)。类装饰器应用于类构造函数,可以用来监视、修改或替换定义。传入一个参数
    (1.1)装饰器工厂:
        function Logclass(parmas:any){
   
   
            return function(target:any){
   
   
                console.log(parmas);  // parmas是传入的参数(实参) http://www.123.com
                console.log(target); //target是其装饰的类本身
                target.prototype.ios = function(){
   
    //可以在target的原型上添加方法和属性
                console.log("I am iosFunction");

                return true;
                }
            }
            }

        @Logclass("http://www.123.com")
        class Http{
   
   
        constructor(){
   
   }
        getData(){
   
   }
        
<think>好的,我现在需要帮助用户了解TypeScript装饰器的使用教程和示例。首先,我需要回忆一下自己之前学过的TypeScript装饰器的相关知识,尤其是类装饰器的部分。用户已经提供了一些引用内容,我需要结合这些引用内容来组织回答。 首先,用户的问题是关于类装饰器的教程和示例。根据引用[2],装饰器可以附加到类声明、方法、属性或参数上,而类装饰器就是用于类声明的。引用[4]和[5]提到了方法装饰器和参数装饰器,但这里重点在类装饰器。 接下来,我需要确定类装饰器的基本结构。根据TypeScript官方文档,类装饰器的函数签名应该接收类的构造函数作为参数,并返回新的构造函数或修改后的类。例如,引用[4]中的例子是关于方法装饰器的,但结构类似,可能需要调整到类装饰器的情况。 然后,我需要创建一个简单的示例,比如一个添加元数据或修改类行为的装饰器。比如,添加一个日志功能,在类实例化时输出日志。或者修改类的原型,添加新的方法或属性。 另外,用户提供的引用[1]提到了泛型和构造函数签名的知识,可能在高级示例中需要用到。比如,泛型类装饰器,或者修改构造函数的行为。 需要注意类装饰器的参数:对于类装饰器,参数是类的构造函数。如果是实例成员,target是类的原型;静态成员则是类的构造函数。但类装饰器本身只接收构造函数作为参数。 然后,分步骤讲解: 1. 类装饰器的定义:函数接收构造函数,返回新的构造函数或修改后的类。 2. 基本示例:比如添加一个sealed装饰器,阻止类被继承。 3. 修改类行为的示例:比如添加属性或方法。 4. 使用工厂函数传递参数的装饰器,比如@logClass('info')这样的形式。 5. 结合泛型的高级用法,可能涉及修改构造函数。 需要确保代码示例正确,并符合用户提到的LaTeX格式要求,比如行内公式用$...$,独立公式用$$...$$。但在这个问题中可能涉及较少数学公式,不过需要注意代码块的使用。 另外,用户要求生成相关问题,可能需要列出与类装饰器相关的其他问题,比如应用场景、参数、与其他装饰器的比较等。 现在检查引用内容是否有关于类装饰器的直接示例。引用[4]中的例子是方法装饰器,引用[5]是参数装饰器。可能需要自己构造类装饰器的例子,但可以参考这些结构。 例如,一个类装饰器可以修改类的构造函数,添加一些属性: function addGreeting<T extends { new (...args: any[]): {} }>(constructor: T) { return class extends constructor { greeting = 'Hello'; }; } @addGreeting class MyClass {} const obj = new MyClass(); console.log(obj.greeting); // 输出Hello 这展示了类装饰器如何扩展类的实例属性。 另一个例子是记录类被实例化的次数: function countInstances(constructor: Function) { let count = 0; constructor.prototype.getInstanceCount = () => count; const original = constructor; const newConstructor: any = function (...args: any[]) { count++; return new original(...args); }; newConstructor.prototype = original.prototype; return newConstructor; } @countInstances class MyClass {} const a = new MyClass(); const b = new MyClass(); console.log(a.getInstanceCount()); // 2 不过需要注意原型链的正确处理,可能需要更严谨的代码。 在回答时,要分步骤讲解,每个示例的代码和解释,确保用户能理解装饰器的应用方式。同时,引用相关的引用内容,比如装饰器是实验性特性,需要启用编译选项,如引用[2]和[3]提到的。 可能还需要提到装饰器的执行顺序、多个装饰器的叠加效果等,但用户的问题可能更关注基本用法和示例。 最后,生成相关问题,比如如何传递参数给类装饰器,类装饰器的应用场景,如何结合其他装饰器使用等。</think>### TypeScript装饰器使用教程 类装饰器用于修改或扩展类的行为,可以直接作用于类声明。以下是具体用法和示例: --- #### 一、启用装饰器支持 在`tsconfig.json`中启用实验性选项: ```json { "compilerOptions": { "experimentalDecorators": true } } ``` --- #### 二、类装饰器基础语法 类装饰器是一个函数,接收类的构造函数作为参数,可以返回新的构造函数或修改原类[^2]。 ```typescript // 定义装饰器 function ClassDecorator(constructor: Function) { // 修改类逻辑 } // 应用装饰器 @ClassDecorator class MyClass {} ``` --- #### 三、基础示例 ##### 1. 添加元数据 ```typescript function AddMetadata(constructor: Function) { constructor.prototype.createdAt = new Date(); } @AddMetadata class User {} const user = new User(); console.log((user as any).createdAt); // 输出创建时间 ``` ##### 2. 密封类(禁止继承) ```typescript function sealed(constructor: Function) { Object.seal(constructor); Object.seal(constructor.prototype); } @sealed class ApiService {} // 尝试继承会报错 class SubApi extends ApiService {} // ❌ Error ``` --- #### 四、高级用法 ##### 1. 装饰器工厂(传参) 通过工厂函数传递参数: ```typescript function LogClass(message: string) { return function (constructor: Function) { console.log(`${message}: ${constructor.name}`); }; } @LogClass("类已装饰") class Calculator {} // 控制台输出: "类已装饰: Calculator" ``` ##### 2. 重写构造函数 扩展类的属性: ```typescript function AddTax<T extends { new (...args: any[]): {} }>(taxRate: number) { return class extends (constructor: T) { price: number; constructor(...args: any[]) { super(...args); this.price = args[0] * (1 + taxRate); } }; } @AddTax(0.1) // 增加10%税费 class Product { constructor(public price: number) {} } const p = new Product(100); console.log(p.price); // 输出 110 ``` ##### 3. 泛型类装饰器 结合泛型实现类型安全: ```typescript function Timestamp<T extends { new (...args: any[]): {} }>(constructor: T) { return class extends constructor { timestamp = Date.now(); }; } @Timestamp class Event { constructor(public name: string) {} } const event = new Event("click"); console.log((event as any).timestamp); // 输出时间戳 ``` --- #### 五、与其他装饰器组合 类装饰器可与其他装饰器(方法、属性装饰器)联合使用: ```typescript function EnumerableClass(constructor: Function) { constructor.prototype.iterable = true; } class Collection { @EnumerableMethod // 方法装饰器(假设已定义) getData() {} } @EnumerableClass class DataList extends Collection {} ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值