装饰器(特殊函数)


提示:

1.前提确保你的 TypeScript 配置启用了装饰器:

确保你的 TypeScript 配置启用了装饰器

在 tsconfig.json 中添加:

experimentalDecorators: true = 让 TypeScript 理解 @装饰器 语法

emitDecoratorMetadata: true = 为装饰器添加额外的类型信息(主要用于框架)

  "compilerOptions": {

    /*
      "experimentalDecorators": true,
        "emitDecoratorMetadata": true,
        这两个作用:
        experimentalDecorators: true = 让 TypeScript 理解 @装饰器 语法
        emitDecoratorMetadata: true = 为装饰器添加额外的类型信息(主要用于框架)
    */
    "experimentalDecorators": true,
        "emitDecoratorMetadata": true,

在这里插入图片描述

装饰器(特殊函数)

一、简介

二、类装饰器

在这里插入图片描述
在这里插入图片描述

3.关于返回值


//关于返回值
function Demo(target: Function){
    // return class {
    //     test(){
    //         console.log(200);
    //         console.log(400);
    //         console.log(300);
    //     }
    // }
}
@Demo
class Person{
    test(){
        console.log(100);
    }
}
console.log(Person);

在这里插入图片描述
在这里插入图片描述

4.关于构造类型

在这里插入图片描述

/*
 new 表示该类型是可以用new操作符来调用
 ...args 表示构造器可以接受【任意数量】的参数
 any[] 表示构造器可以接受【任意类型】的参数
 {} 表示返回类型是对象(非null,非undefined的对象)
*/

type Constructor = new (...args:any[]) =>{}

//需求fn是一个函数,调用fn并返回结果
function test (fn:Function){}

class Person{}

test(Person)

在这里插入图片描述

在这里插入图片描述

5.替换被装饰的类

装饰器里面return即可
在这里插入图片描述

//需求:设计一个LogTime装饰器,可以给实例填加一个属性,
// 用于记录实例对象的创建时间,再添加一个方法,用于获取创建时间

//还有更多功能
type Constructor =new (...args:any[])=>{};

//为类添加接口声明,要不然console.log(p1.getCreateTime());报错说Person上没有这个方法
interface Person{
    getCreateTime():void;
    // createTime:Date;
    // getCreateTime():string;
}

//装饰器
function LogTime<T extends Constructor>(target:T){
    return class extends target{
        createTime:Date;
        constructor(...args:any[]){
            super(...args);
            this.createTime=new Date();
        }
        getCreateTime(){
            return `创建时间是:${this.createTime}`
        }
    };
}

@LogTime
class Person {
    name: string;
    age: number;

    constructor(name: string, age: number) {
        this.name = name;
        this.age = age;
    }
    Speak() {
        console.log(`My name is ${this.name}, I am ${this.age} years old.`);
    }
}
const p1=new Person("Alice", 30);
console.log(p1);
console.log(p1.getCreateTime());

三、装饰器工厂

在这里插入图片描述
在这里插入图片描述

四、装饰器组合

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

五、属性装饰器

区别与类装饰器

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

六、方法装饰器

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

参数说明

/*
参数说明:
target:对于静态方法来说值是类,对于实例方法来说值是原型对象

propertyKey;方法的名称

descriptor:方法的描述对象,其中value属性是被装饰的方法

*/ 

function Demo(target:object,propertyKey:string,descriptor:PropertyDescriptor){
    console.log(target)
    console.log(propertyKey)
    console.log(descriptor)
}
class Person{
    constructor(
        public name:string,
        public age:number
    ){}

    //Demo装饰实例的方法
    @Demo speak(){
        console.log(`你好,我的名字是:${this.name},我的年龄${this.age}`)
    }
    //Demo装饰静态的方法
    @Demo static isAdult(age:number){
        return age >=18
    }
}

// ********** 调用示例 **********
// 1. 实例方法:必须先创建实例,通过实例调用
const person1 = new Person("张三", 20);
person1.speak(); // 输出:你好,我的名字是:张三,我的年龄20

// 错误写法:直接用类调用实例方法(会报错)
// Person.speak(); // ❌ Property 'speak' does not exist on type 'typeof Person'

// 2. 静态方法:直接通过类调用,不需要创建实例
console.log(Person.isAdult(20)); // 输出:true
console.log(Person.isAdult(17)); // 输出:false

// 错误写法:通过实例调用静态方法(TS会提示,JS中虽能执行但不推荐)
// person1.isAdult(20); // ❌ Property 'isAdult' does not exist on type 'Person'

打印日志的装饰器

//打印日志的装饰器
// 可以执行之前走一个逻辑,speak执行之后走一个逻辑
function Logger(target: object, propertyKey: string, descriptor: PropertyDescriptor) {//内置的类型PropertyDescriptor(属性的描述器)
    //存储原始方法
    const originnal = descriptor.value
    //替换原始方法
    descriptor.value = function (...args: any[]) {
        console.log(`${propertyKey}开始执行......`)
        const result = originnal.call(this, ...args)//这一行代码是用来执行原始函数,如果这一行写成
        /*
        originnal()  这样会把this搞丢,所以要写成original.call(this,)传参数
         */
        /* js原始知识:面试题
        const result = originnal.call(this, ...args)
        return originnal.apply(this,args)
        call和apply区别:都能修改函数this,但是他俩第二个参数不同,
        对于call得一个一个传进去,而对于apply需要传递一个数组
         */
        console.log(`${propertyKey}执行完毕......`)
        return result//speak方法有返回值
    }
}

//装饰器Validate
function Validata(maxValue: number) {
    return function (target: object, propertyKey: string, descriptor: PropertyDescriptor) {
        //保存原始方法
        const originnal = descriptor.value;
        //替换原始方法
        descriptor.value = function (...args: any[]) {
            //自定义的验证逻辑
            if (args[0] > maxValue) {
                throw new Error('年龄非法!')
            }
            //如果所有参数都符合要求,则调用原始方法
            return originnal.apply(this, args)
        }
    }
}


class Person {
    constructor(
        public name: string,
        public age: number
    ) { }
    //方法装饰器
    // str:string
    @Logger speak() {
        console.log(`你好,我的名字是:${this.name},我的年龄${this.age}`)
    }
    @Validata(120)
    static isAdult(age: number) {
        return age >= 18
    }
}

const p1 = new Person('tom', 19)
console.log(p1.speak)



js原始知识:面试题
const result = originnal.call(this, …args)
return originnal.apply(this,args)
call和apply区别:都能修改函数this,但是他俩第二个参数不同,
对于call得一个一个传进去,而对于apply需要传递一个数组

七、访问器装饰器

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

/*
参数说明:
target:
1.对于实例访问器起来说值是【所属类的原型对象】
2.对于静态访问器来说值是【所属类】
propertyKey:访问器的名称
descriptor:描述对象
*/

function Demo(target:object,propertyKey:string,descriptor:PropertyDescriptor){
    // console.log(target)
    // console.log(propertyKey)
    console.log(descriptor)
}
class Person{
    @Demo//实例访问器
    get address(){
        return'北京科技园'
    }
    @Demo//静态访问器
    static get country(){
        return '中国'
    }
}

在这里插入图片描述

参数说明:

/*
参数说明:
target:
1.对于实例访问器起来说值是【所属类的原型对象】
2.对于静态访问器来说值是【所属类】
propertyKey:访问器的名称
descriptor:描述对象
*/

function Demo(target:object,propertyKey:string,descriptor:PropertyDescriptor){
    // console.log(target)
    // console.log(propertyKey)
    console.log(descriptor)
}
class Person{
    @Demo//实例访问器
    get address(){
        return'北京科技园'
    }
    @Demo//静态访问器
    static get country(){
        return '中国'
    }
}

实例说明

//访问器(set,get),装饰器工厂
function RangeValidate(min:number,max:number){
    return function(target:object,propertyKey:string,descriptor:PropertyDescriptor){
        //保存原始的setter方法,以便在后续调用中使用
        const originalSetter= descriptor.set;
        //重写setter方法,加入范围验证逻辑
        descriptor.set = function (value:number){
            //检查设置的值是否在指定的最小值和最大值之间
            if(value<min||value>max){
            //如果值不在范围内,抛出错误
            throw new Error (`${propertyKey}的值应该在${min}${max}之间`)
            }
            //如果值不在范围内,且原始setter方法存在,则调用原始的setter方法
            if (originalSetter){
                originalSetter.call(this,value);
            }
        }

    }
}

class Weather{
    private _temp:number;//温度
    constructor(_temp:number){
        this._temp=_temp
    }
    //设置温度范围在-50到50之间
    @RangeValidate(-50,50)//范围验证,装饰器工厂
    set temp(value){
        this._temp=value;
    }
    get temp(){
        return this._temp;
    }

}
const w1=new Weather(25)
console.log(w1.temp)

// console.log(w1)

八、参数装饰器

在这里插入图片描述

在这里插入图片描述

/*
参数说明:
target:
1.如果修饰的是【实例方法】的参数,target是类的【原型对象】
2.如果修饰的是【静态方法】的参数,target是【类】
propertyKey:参数所在的方法的名称
paranameterIndex:参数在函数列表中的索引,从0开始

*/
function Demo(target: object, propertyKey: string, paranameterIndex: number) {
    console.log(target)
    console.log(propertyKey)
    console.log(paranameterIndex)
}
//类定义
class Person {
    constructor(public name: string) { }
    speak(@Demo message1: any, message2: any) {
        console.log(`${this.name}想对说:${message1},${message2}`)
    }
}

总结

内容概要:本文介绍了一个关于三相桥式全控整流及有源逆变电路的实验仿真模型,重点研究三相整流器与逆变器在Simulink环境下的建模与仿真技术。内容涵盖电力电子变换器的工作原理、控制策略设计、系统动态响应分析,并进一步扩展至10kV配电网中不同中性点接地方式(中性点不接地、经小电阻接地、经消弧线圈接地)下的单相、两相短路接地及相间短路故障的仿真研究,全面呈现了电力系统典型故障的暂态特性。此外,文档还整合了丰富的科研资源,涵盖电力系统优化、新能源并网、故障诊断、微电网调度等多个前沿方向,充分体现了Matlab/Simulink在电气工程仿真中的核心地位和广泛应用价值。; 适合人群:电气工程、自动化、电力电子等相关专业的高校学生、科研人员及工程技术人员,具备一定的电路理论基础和仿真软件操作经验者更佳。; 使用场景及目标:①用于教学实验中帮助理解三相整流与逆变电路的工作机制;②支撑科研项目中对电力系统故障特性的建模与分析;③作为开发新型控制算法(如PWM控制、低电压穿越等)的仿真验证平台;④辅助完成毕业设计、课题研究或工程方案评估; 阅读建议:此资源以Simulink仿真实现为核心,强调理论与实践结合,建议读者在学习过程中同步搭建模型,动手调试参数,深入理解各模块功能与系统整体行为,同时可参考文中提供的完整资源链接拓展研究视野。
内容概要:本文介绍了一个关于风光制氢合成氨系统优化研究的论文复现资源,依托Cplex求解器在Matlab环境中实现系统建模与求解。该资源聚焦于新能源耦合系统,涵盖风能、太阳能发电制氢,并进一步合成氨的全流程能量管理与优化调度,通过数学建模与优化算法实现系统经济性与运行效率的最大化。内容不仅包括风光出力不确定性处理、电解水制氢、氢气储存与转化、氨合成工艺等关键环节的建模,还整合了多种智能优化算法与电力系统调度策略,如二阶锥规划、多目标优化与需求响应机制,旨在为科研人员提供一套完整的综合能源系统优化研究框架与代码实现范例。; 适合人群:具备一定电力系统、优化理论及Matlab编程基础的研究生、科研人员及工程技术人员,尤其适合从事新能源系统优化、综合能源系统规划、氢能与氨能转化等前沿方向的研究者。; 使用场景及目标:① 复现高水平期刊论文中的风光制氢合成氨系统优化模型,掌握Cplex在Matlab中的建模与求解流程;② 学习并应用二阶锥规划、多目标优化、需求响应等先进优化方法于综合能源系统科研项目中;③ 借助提供的完整Matlab代码案例,快速搭建仿真环境,加速科研进程,提升学术创新能力与工程实践水平。; 阅读建议:此资源以科研复现为核心,强调理论与实践深度融合,建议读者在学习过程中结合文档中的代码实例,逐步调试与理解模型构建逻辑,并尝试进行参数调整与模型拓展,以深化对综合能源系统多能耦合与优化调度机制的理解与应用能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值