Typescript装饰器AOP示例详解

目录
  • 在Typescript中使用装饰器
    • 配置
    • 类装饰器
    • 方法装饰器
    • AOP(面向切面编程)

在Typescript中使用装饰器

上文中讲了装饰模式,今天来来介绍一些Typescript里面的装饰器,以及如何用装饰器来实现之前提及装饰模式,装饰器只是实现装饰模式的一种方式,并非唯一

配置

在Typescript要使用装饰器需要在tsconfig打开装饰器的语法

"compilerOptions": {
  "experimentalDecorators": true
}

类装饰器

在Typescript中我们可以对一个class用装饰器进行拓展,比如下面的例子, 会打印出'target is class A'的log日志;

const injectable = () =>
  (target: { new (...args: any[]): {} }) => {
    console.log('target is ',target)
  };
@injectable()
class A {}

在类装饰器中我们可以获取到这个类,从而对他进行拓展

比如我们可以为这个类实现拓展

const AddName =  (name: string) => (cls: { new (...args: any[]): {} }) => {
   cls.prototype.name = name
}
@AddName('name')
class A {
    age = 18
}
const a = new A()
console.log(a.name)
console.log(a.age)

方法装饰器

方法装饰器的语法如下,你可以获取到当前类,方法名,以及该属性的描述符

const log = () => {
    return  (target: any, propertyKey: string, descriptor: PropertyDescriptor) => {
        console.log(target, propertyKey, descriptor)
    };
}
class A {
    @log
    say() {}
}

打印如下

A: {},  "say",  {
  "writable": true,
  "enumerable": false,
  "configurable": true
}

那么方法装饰器可以用来做什么呢?
AOP就是其中一个例子

AOP(面向切面编程)

在软件业,AOP为Aspect Oriented Programming的缩写,意为:[面向切面编程],通过[预编译]方式和运行期间动态代理实现程序功能的统一维护的一种技术。

AOP是[OOP]的延续,是软件开发中的一个热点,也是[Spring]框架中的一个重要内容,是[函数式编程]的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的[耦合度]降低,提高程序的可重用性,同时提高了开发的效率。

这贴一段百科对AOP的简介
下面给一个简单的例子,我们可以对函数执行过程进行

const log = () => {
    return  (target: any, propertyKey: string, descriptor: PropertyDescriptor) => {
        const oldFn = descriptor.value
        descriptor.value = function (...args:any[]) {
            console.log('在函数执行前');
            const res = oldFn.apply(this, args);
            console.log('在函数执行后', res);
            return res;
        }
    };
}
class A {
    @log()
    say() {
        return 'Hello world'
    }
}
new A().say()

执行结果如下

[LOG]: "在函数执行前"

* * *

[LOG]: "在函数执行后", "Hello world"

以上就是Typescript装饰器AOP示例详解的详细内容,更多关于Typescript装饰器AOP的资料请关注我们其它相关文章!

运行结果如下,可以看到下面的数据和上方使用mysql客户端查出来结果一致

The solution is:  [{"name":"jym","age":"1"},{"name":"jym2","age":"2"},{"name":"jym3","age":"3"},{"name":"jym4","age":"4"}]

通过mysql2这个包,我们就可以用node.js连接数据库了,可以使用一些基础的API来直接操作mysql数据库;比如上面的代码中就执行了'SELECT * FROM user'这个sql语句

除了使用这种基础库之外,我们还可以使用ORM(对象关系映射器)框架来连接数据库,直接用OOP的方式来编写模型和方法,ORM框架会帮助你生成对应的sql语句,这样就可以把关注点放在业务上面,而不用编写SQL语句。这可以让你的代码更加简洁和可维护

目前在nodejs中常用的ORM有prisma,sequlize,typeorm等等,下回我们就来尝试一下如何用ORM来连接数据库

以上就是Node.js连接数据库实现过程详解的详细内容,更多关于Node.js连接数据库的资料请关注我们其它相关文章!

(0)

相关推荐

  • 项目中使用TypeScript的TodoList实例详解

    目录 为什么用todolist todolist的ts化 数据到视图 实现handleTodoItem readonly 分类 交叉类型 新增功能 联合类型 可选属性 数据转视图 总结 为什么用todolist 现代的框架教程目前再也不是写个hello world那么简单了,而是需要有一定基础能力能够做到数据绑定.遍历.条件判断等各种逻辑,而能完成这一系列内容的,todolist就是个很好的实现,比如react的教程.solijs教程都是以todolist为例 当然,你如果想看各种框架实现tod

  • 使用VueCli3+TypeScript+Vuex一步步构建todoList的方法

    前言 Vue3.x 即将来袭,使用 TypeScirpt 重构,TypeScript 将成为 vue 社区的标配,出于一名程序员的焦虑,决定现在 Vue2.6.x 踩一波坑. vue 官方文档已经简略地对 typescript 的支持进行了介绍,我们使用 Vue Cli3 直接生成项目 创建项目 ❓为什么使用 Vue Cli3 构建项目 官方维护,后续升级减少兼容性问题 使用以下配置进行项目的生成: Babel 对 Ts 进行转译 TSLint 对 TS 代码进行规范,后续会使用 prettie

  • TypeScript 背后的结构化类型系统原理详解

    目录 前言 什么是结构化类型系统? 什么是标称类型系统? 结构化类型系统等价于鸭子类型系统吗? 如何在 TypeScript 中模拟标称类型系统? 交叉类型实现 类实现 总结 前言 你能说清楚类型.类型系统.类型检查这三个的区别吗?在理解TypeScript的结构化类型系统之前,我们首先要搞清楚这三个概念和它们之间的关系 类型:即对变量的访问限制与赋值限制.如 TypeScript 中的原始类型.对象类型.函数类型和字面量类型等类型,当一个变量类型确定后,你不能访问这个类型中不存在的属性或方法,

  • Vite+React+TypeScript手撸TodoList的项目实践

    目录 布局与样式 创建工程 定义全局数据类型 实现步骤 源码地址 布局与样式 一个TodoList长什么样子相信无需多言: 上样式: src/TodoList.css .td-wrapper { width: 700px; margin: 0 auto; } .dp-wrapper { width: 100%; height: 40px; display: flex; margin-top: 10px; } .dp-wrapper input { flex: 4; height: 36px; l

  • 基于tsup打包TypeScript实现过程

    目录 什么是tsup ⚙️ Install 快速上手 配置文件 打包构建 小彩蛋 安装失败~ 什么是tsup Tsup 可以快速打包 typescript 库,无需任何配置,并且基于esbuild进行打包,打包 ts 文件速度毫秒级,方便又高效. ⚙️ Install 在项目文件夹中本地安装它.官网传送门 npm i tsup -D # Or Yarn yarn add tsup --dev Tsup也可以全局安装,但不建议这样做. 快速上手 tsup默认支持无配置打包,我们尝试一下. 步骤 1

  • TypeScript 中 as const使用介绍

    目录 引言 例子 例子 引言 as const 是 TypeScript 中的一个用于修饰符,它可以被用来修改类型推断的行为. 当 as const 修饰符用在变量声明或表达式的类型上时,它会强制 TypeScript 将变量或表达式的类型视为不可变的(immutable).这意味着,如果你尝试对变量或表达式进行修改,TypeScript 会报错. 例子 const foo = ['a', 'b'] as const; foo.push('c'); // TypeScript 会报错,因为 fo

  • Typescript装饰器AOP示例详解

    目录 在Typescript中使用装饰器 配置 类装饰器 方法装饰器 AOP(面向切面编程) 在Typescript中使用装饰器 上文中讲了装饰模式,今天来来介绍一些Typescript里面的装饰器,以及如何用装饰器来实现之前提及装饰模式,装饰器只是实现装饰模式的一种方式,并非唯一 配置 在Typescript要使用装饰器需要在tsconfig打开装饰器的语法 "compilerOptions": { "experimentalDecorators": true }

  • Python使用自定义装饰器的示例详解

    在Python自动化测试中,使用自定义的装饰器来给测试方法传递测试数据: reader.py import csv import json from openpyxl import load_workbook from setting import DATA_DIR from os import path class Reader: @classmethod def read_excel(cls,xlname, min_row, max_row, min_col, max_col): xlnam

  • python装饰器使用实例详解

    这篇文章主要介绍了python装饰器使用实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 python装饰器的作用就是在不想改变原函数代码的情况下,增加新的功能.主要应用了python闭包的概念,现在用1个小例子说明 import time def foo(): time.sleep(1) def bar(): time.sleep(2) def show_time(f): def inner(): start_time = time.t

  • Python 中的函数装饰器和闭包详解

    函数装饰器可以被用于增强方法的某些行为,如果想自己实现装饰器,则必须了解闭包的概念. 装饰器的基本概念 装饰器是一个可调用对象,它的参数是另一个函数,称为被装饰函数.装饰器可以修改这个函数再将其返回,也可以将其替换为另一个函数或者可调用对象. 例如:有个名为 decorate 的装饰器: @decorate def target(): print('running target()') 上述代码的写法和以下写法的效果是一样的: def target(): print('running targe

  • python装饰器实例大详解

    一.作用域 在python中,作用域分为两种:全局作用域和局部作用域. 全局作用域是定义在文件级别的变量,函数名.而局部作用域,则是定义函数内部. 关于作用域,我们要理解两点: a.在全局不能访问到局部定义的变量 b.在局部能够访问到全局定义的变量,但是不能修改全局定义的变量(当然有方法可以修改) 下面我们来看看下面实例: x = 1 def funx(): x = 10 print(x) # 打印出10 funx() print(x) # 打印出1 如果局部没有定义变量x,那么函数内部会从内往

  • Python 带有参数的装饰器实例代码详解

    demo.py(装饰器,带参数的装饰器): def set_level(level_num): def set_func(func): def call_func(*args, **kwargs): if level_num == 1: print("----权限级别1,验证----") elif level_num == 2: print("----权限级别2,验证----") return func() return call_func return set_f

  • Python函数装饰器的使用详解

    目录 装饰器 装饰器的定义 装饰器的意义 装饰器的使用 无参装饰器 有参装饰器 实例练习 总结 装饰器 装饰器的定义 关于装饰器的定义,我们先来看一段github上大佬的定义: Function decorators are simply wrappers to existing functions.In the context of design patterns,decorators dynamically alter the functionality of a function, met

  • TypeScript 泛型推断实现示例详解

    目录 前言 基础类型准备 最终使用的方式 基于Interface的实现 (失败了) 所有内容都基于type 实现 完整Demo 结束语 前言 最近做东西都在用ts,有时候写比较复杂的功能,如果不熟悉,类型写起来还是挺麻烦的.有这样一个功能,在这里,我们就不以我们现有的业务来举例了,我们还是已Animal举例,来说明场景.通过一个工厂来创建不同的动物实例.在这里我们借助泛型来实现类型的约束和动态推到指定类型. 基础类型准备 用一个枚举来定义Animal的类型 enum EAnimalType {

  • Elasticsearch Analyzer 内置分词器使用示例详解

    目录 前置知识 1.Analyzer 2.Elasticsearch 内置分词器 3. Standard Analyzer 3.1 Definition 3.2 Configuration 3.3 实验 4. Simple Analyzer 4.1 Definition 4.2 Configuation 4.3 实验 5. Stop Analyzer 5.1 Definition 5.2 Configuration 5.3 实验 6. Whitespace Analyzer 6.1 Defini

  • 基于C#实现屏幕取色器的示例详解

    目录 实践过程 效果 代码 实践过程 效果 代码 public partial class Form1 : Form { public Form1() { InitializeComponent(); } [DllImport("gdi32.dll")] static public extern uint GetPixel(IntPtr hDC, int XPos, int YPos); [DllImport("gdi32.dll")] static public

随机推荐