TypeScript反射机制动态创建类

2023-10-27

前言

在前一篇文章桥接模式与策略模式的区别与刘伟老师的桥接模式中,我们可以明白桥接模式处理得比较好的一个点是在于Java的反射机制

那么,假如我们需要再TypeScript中,来实现桥接模式的处理,需要怎么样来实现这个“反射”呢?

注:在策略模式中,该文章的处理全部适用。

思路

反射机制:就是要实现通过一个Key值来创建一个类。

那么在TypeScript中,普通的对象就有key:value的这样的格式,然后TypeScript编译后的源代码是JavaScript,而JS的类创建是通过原型对象来创建的。所以可以利用这样的关系,把TypeScrip中的类(在JS中变现为原型对象),保存在一个普通对象里。

注:普通对象可以用例子变现为:let ClassStorage= {};其中ClassStorage就是我们所说的普通对象。

实现思路需要的类

我们需要

        代理类:ProxyClass,来实现从Key转化为具体对象的类。

        存储类:StorageClass,用来保存我们的类。

这两个类是实现桥接模式中,反射机制的核心。

然后接下来,需要有模拟桥接模式的测试类,来完成桥接模式的闭环。

        测试类:Test,用来通过反射调用不同的类。

        被调用基类:ClassBase,定义接口,在Test类中调用。

        被调用派生类:***Classs,定义具体行为。

具体代码

ProxyClass.ts:


import { ClassStorage } from "./ClassStorage";


export class ProxyClass {
    /**
  * 代理构建方法
  * @param className 动态类名称
  * @param option 动态类创建参数
  */
    static getClass(className: string, option?: any) {
        //一个简单的异常判断,如果存储类中不存在此类 则抛出异常提醒
        if (ClassStorage[className] === undefined || ClassStorage[className] === null) {
            console.warn(`未找到 className:${className} 对应实现`);
            return null;
        }
        //从存放对象上找出对应class 创建即可
        return new (ClassStorage[className])(option)
    }

    static checkValidClass(className: string) {
        //一个简单的异常判断,如果存储类中不存在此类 则抛出异常提醒
        if (ClassStorage[className] === undefined || ClassStorage[className] === null) {
            return null;
        }
        //从存放对象上找出对应class 创建即可
        return className
    }
}

ClassStorage.ts:

export let ClassStorage: any = {};

Test.ts:

import { ClassBase } from "./ClassBase";
import { ProxyClass } from "./ProxyClass";
export class Test {
    constructor() {
        // 因为创建的是ProxyClass 类型 所以需要 as 进行类型断言
        // 这样ts就可以进行友好提示了!
        this.createClass("AClass");
        this.createClass("BClass");
        this.createClass("CClass");
    }

    createClass(type: string): ClassBase {
        let a: ClassBase = new ProxyClass(type);
        a.test();
    }
}

ClassBase.ts:

export abstract class ClassBase {
    abstract test(): void;
}

AClass.ts:

import { ClassStorage } from "./ClassStorage";
import { ClassBase } from "./ClassBase";
export class AClass extends ClassBase {
    test(): void {
        console.log("this is AClass");
    }
}

ClassStorage["AClass"] = AClass;

BClass.ts:

import { ClassStorage } from "./ClassStorage";
import { ClassBase } from "./ClassBase";
export class BClass extends ClassBase {
    test(): void {
        console.log("this is BClass");
    }
}

ClassStorage["BClass"] = BClass;

CClass.ts:

import { ClassStorage } from "./ClassStorage";
import { ClassBase } from "./ClassBase";
export class CClass extends ClassBase {
    test(): void {
        console.log("this is CClass");
    }
}

ClassStorage["CClass"] = CClass;

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TypeScript反射机制动态创建类 的相关文章

随机推荐

  • css区别margin、padding、width、height值为百分比

    margin padding设置为百分比 是相对父元素宽来说的 width设置百分比是相对父元素宽来说的 height设置百分比是相对父元素高来说的 使用padding占位的好处就是布局不会因为图片没有加载而改变
  • 4步教你打造好莱坞科幻特效

    大家一定有看过好莱坞电影 电影里的一幕大家一定印象深刻 男主角在电脑前熟练地敲着键盘 电脑屏幕飞快地闪动 字符也在快速跳动 很有科技感 这样的效果 在 Linux 下也可以实现 甚至连不懂任何 IT 技术的小白跟着本教程也可以轻松装13 我
  • 【数据结构】两栈共享空间(双端栈)

    1 定义 两栈共享空间 使用一个数组来存储两个栈 让一个栈的栈底为该数组的始端 另一个栈的栈底为该数组的末端 两个栈从各自的端点向中间延伸 栈1的底固定在下标为0的一端 栈2的底固定在下标为StackSize 1的一端 top1和top2分
  • 学习软件测试真的三个月可以找到工作吗?

    最近我看到有很多同学私信我 都在问我学了三个月的测试 现在工作怎么样 薪资如何 学的东西能不能在公司里面用到 今天看到这些信息 我就刚好写一篇文章 给大家科普一下 本人之前是做销售行业的 之前写的文章有提到过 因为销售行业竞争太大 并且每个
  • macOS虚拟机安装全过程(VMware)

    作为一名忠实果粉 我最大的愿望就是能够拥有一台Macbook 体验macOS 但是作为学生党 这价钱 贵到离谱啊 不过 VMware这个神器 可以解决一切问题 既然macOS可以在Macbook上运行 为什么就不能在VMware虚拟机上运行
  • python x 0b1010_下面代码的输出结果是

    单选题 下面代码的执行结果是 x 2 x 3 5 2 单选题 下面代码的输出结果是 x 0o1010 print x 单选题 下面代码的执行结果是 s 11 5in eval s 1 2 单选题 关于CSV文件的描述 以下选项中错误的是 单
  • 前端开发--CSS基础

    快速生成css样式 采用简写的方式即可 w200 tab键 width 200px lh200 tab键line height 200px web服务器 免费的远程服务 免费空间 http free 3v do css的书写顺序 布局定位属
  • mac外接显示屏开启hidpi的方法

    之前一直用着switchResX 但是手贱升级到macos10 14之后就失效了 只好另寻别的方法了 准备工作 RDM 开源的更改分辨率插件 快捷下载 PlistEdit PRO plist文件修改器 在线16进制和10进制互转工具 1 关
  • 加州伯克利计算机科学录取,2020加州大学伯克利分校统计学录取案例。

    一 学生背景 本科院校类型 美国本科 本科专业 Applied Mathematics GPA 3 4 4 0 GRE 321 录取项目 MA in Statistics 二 录取学校加州大学伯克利分校介绍 加州大学伯克利分校 Univer
  • HDU 2888 Check Corners

    题目链接 http acm hdu edu cn showproblem php pid 2888 include
  • Vue3 readonly

    readonly 接收一个 ref 或者 reactive 包装对象 返回一个只读的响应式对象 实例
  • ubuntu20.04防火墙相关命令整理

    1 查看防火墙状态 sudo ufw status 2 开启防火墙 sudo ufw enable 3 关闭防火墙 sudo ufw disable 4 重启防火墙 sudo ufw reload 4 开启指定端口 sudo ufw all
  • pytorch踩坑日记

    昨天使用pytorch写一个程序 程序写完之后却一直不能正确运行 今天定位到了代码的问题所在 我的代码其中有一处逻辑是这样的 get a 这里的a就是我想反向求导更新的参数 b torch nonzero a 得到a里面所有不为0的下标 f
  • Spring自定义注解定义AOP配置去xml

    原理参考ImportBeanDefinitionRegistrar SPI简化Spring开发 spring中AOP使用非常广泛 引入方式一般分为两种 注解方式或xml方式 直接方式使用 AspectJ这样的注解 其缺点是需要手写切面实现业
  • 机器学习笔记--1.6数据可视化

    1 表与线性结构的可视化 Python提供四种容器结构 list dict set tuple来装载数据 其中线性结构有两种 list和tuple 由于tuple是只读结构 仅用于外部生成器生成的数据 所以最常用的线性结构就是list im
  • Ldap简单介绍(转)

    注 文章内容转载 觉得对ldap初次接触的你我非常的实用 关于LDAP的概念随便网上有很多 我不想重复 这里只是说一下我自己的 理解 都说它是 轻量级目录协议 太专业 我不懂 我只把它想象成 简单 的 目录协议 几个很重要的概念 以后会用到
  • Linux下MySQL安装

    MySQL安装 过程 下载官方包 wget i c http dev mysql com get mysql57 community release el7 10 noarch rpm 成功信息 FINISHED 2023 03 20 09
  • php预览md文件,用HTML+CSS做一个实时预览的markdown编辑器

    这次给大家带来用HTML CSS做一个实时预览的markdown编辑器 用HTML CSS做一个实时预览的markdown编辑器的注意事项有哪些 下面就是实战案例 一起来看一下 第一步 搭建布局 1 构思布局 以下是总体布局 2 项目下新建
  • 在cmd命令下启动软件

    1 配置jdk 1 找到jdk的安装路径 点开到bin目录下 复制这个目录 如下图 2 我的电脑 右键属性 高级系统设置 环境变量 双击 如下图 3 系统变量 path 双击 如下图 4 粘贴上面复制的路径到变量值最前面 末尾以英文的逗号结
  • TypeScript反射机制动态创建类

    前言 在前一篇文章桥接模式与策略模式的区别与刘伟老师的桥接模式中 我们可以明白桥接模式处理得比较好的一个点是在于Java的反射机制 那么 假如我们需要再TypeScript中 来实现桥接模式的处理 需要怎么样来实现这个 反射 呢 注 在策略