Typescript高级: 深入理解工厂函数类型

工厂函数类型

  • 代表任意一个类的构造函数【等价JS的构造函数】的函数类型
  • 在TS中无法使用 new 来直接实例化一个 function
  • 现在通过几个小case来测试下这种类型

1 )模拟一个动物的行为接口(简单)

  • 创建几个实现了这个接口的类来展示接口的用途和如何使用它

  • 下面是一个关于动物及其行为(以吃东西为例)的TypeScript示例:

    // 定义一个动物行为接口,其中包含一个eat方法
    interface AnimalBehavior {eat: (...args: any) => any;
    }// 实现AnimalBehavior接口的Dog类
    class Dog implements AnimalBehavior {name: string;constructor(name: string) {this.name = name;}// 实现eat方法,模拟狗吃骨头的行为eat(food: string): void {console.log(`${this.name} the dog is eating ${food}.`);}
    }// 实现AnimalBehavior接口的Cat类
    class Cat implements AnimalBehavior {name: string;constructor(name: string) {this.name = name;}// 实现eat方法,模拟猫吃鱼的行为eat(food: string): void {console.log(`${this.name} the cat is enjoying ${food}.`);}
    }// 使用示例
    function feedAnimal(animal: AnimalBehavior, food: string): void {animal.eat(food);
    }// 创建Dog和Cat实例
    const myDog = new Dog("Rex");
    const myCat = new Cat("Whiskers");// 喂食
    feedAnimal(myDog, "a bone"); // 输出: Rex the dog is eating a bone.
    feedAnimal(myCat, "fish"); // 输出: Whiskers the cat is enjoying fish.
    
  • 在这个示例中,定义了一个AnimalBehavior接口,它要求实现类必须有一个名为eat的方法 eat: (...args: any) => any;

  • 注意,这里还没有涉及任何的工厂函数类型

  • 该方法可以接受任意数量的参数并返回任意类型

  • 接着,创建了两个类Dog和Cat,它们都实现了AnimalBehavior接口,并分别实现了eat方法来模拟各自的进食行为

  • 最后,我们定义了一个feedAnimal函数,它接受任何实现了AnimalBehavior接口的对象以及食物类型作为参数

  • 以此展示如何通过接口来规范和使用不同类型的对象

2 )模拟一个简单的银行贷款服务场景

  • 定义一个CommercialBank类来表示银行
  • 这个类包含了银行的基本信息,如地址和名称,并提供了一个贷款方法
    class CommercialBank {public address: string;public name: string;constructor(name: string, address: string) {this.address = address;this.name = name;}loan(): void {console.log(`${this.name} 银行提供贷款服务`);}
    }type Cst<T> = new (...args: any[]) => T; // 工厂函数类型function createBank<T extends CommercialBank>(BankClass: Cst<T>, name: string, address: string): T {return new BankClass(name, address);
    }class SavingsBank extends CommercialBank {saveMoney(): void {console.log("储蓄银行提供存款服务");}
    }const savingsBank = createBank<SavingsBank>(SavingsBank, "储蓄银行", "上海");
    savingsBank.loan(); // 输出: 储蓄银行提供贷款服务
    savingsBank.saveMoney(); // 输出: 储蓄银行提供存款服务
    
  • 在TypeScript中,通过new关键字,我们可以实例化一个类
  • 但直接new一个普通函数是不允许的,因为TypeScript严格区分了函数和构造函数
  • 为了表示一个可以被new操作符使用的构造函数类型,我们引入了构造函数类型constructor
  • 它是一个特殊的类型别名,表示可以接受任意参数并返回一个特定类型实例的函数
  • type Cst<T> = new (...args: any[]) => T 这条语句,作为工厂函数类型的示例,而且是一个泛型工厂类型

构造函数类型与工厂函数类型的示例


1 )构造函数类型

  • 构造函数类型主要指代那些用于创建类实例的函数。
  • 在TypeScript中,当你定义一个类时,实际上就是在定义一个构造函数类型。构造函数通过new关键字被调用,用于初始化新创建的对象并分配内存。
  • 构造函数类型关心的是如何创建和初始化一个特定类的实例
    class Animal {name: string;constructor(name: string) {this.name = name;}
    }
    
  • 这里Animal就是构造函数类型
  • 它接收一个string参数并返回Animal类型的实例

2 )工厂函数类型

  • 工厂函数类型是一种设计模式的体现,其目的是提供一个统一的接口用于创建一系列相关或依赖对象,而不需要向客户端暴露创建逻辑
  • 工厂函数通常返回一个对象实例,但与构造函数不同,它不一定要使用new关键字
  • 工厂函数的优势在于它可以根据输入参数的不同,返回不同类型的对象,提供更大的灵活性
  • 在TypeScript中,可以通过定义一个返回构造函数类型的函数来实现工厂函数类型,比如:
    // 这里是 简单工厂类型,不是泛型工厂类型
    type AnimalConstructor = new (name: string) => Animal;function getAnimalFactory(animalType: string): AnimalConstructor {if (animalType === 'dog') {return Dog; // 假设Dog是另一个实现了Animal的类} else if (animalType === 'cat') {return Cat; // 同理,Cat也是实现了Animal的类} else {throw new Error('Unsupported animal type');}
    }const dogFactory = getAnimalFactory('dog');
    const myDog = new dogFactory('Rex'); // 使用工厂函数得到的构造函数创建对象
    

总结

  • 尽管构造函数类型和工厂函数类型在实际应用中可以紧密相连
  • 它们的核心区别在于:
    • 构造函数类型专注于初始化单一类型实例的细节
    • 工厂函数类型则提供了一个更高层次的抽象,根据条件或参数决定创建哪种类型的实例,增加了灵活性和解耦
    • 因此,它们虽有联系,但在设计意图和应用场景上有所区分

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/13713.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机精选期刊特辑

文章目录 一、征稿简介二、合作期刊三、投稿咨询四、咨询 一、征稿简介 艾思科蓝依托互联网信息与数据库技术、整合渠道与合作资源&#xff0c;提供EI/SCI/SCIE/SSCI期刊论文的内容审查、发表支持等服务。艾思科蓝与多所知名出版社达成战略合作关系&#xff0c;持续开展合作征…

利用神经网络学习语言(一)——自然语言处理的基本要素

相关说明 这篇文章的大部分内容参考自我的新书《解构大语言模型&#xff1a;从线性回归到通用人工智能》&#xff0c;欢迎有兴趣的读者多多支持。 本文涉及到的代码链接如下&#xff1a;regression2chatgpt/ch10_rnn/tokenizer.ipynb 本系列文章将深入探讨一种应用广泛的神经…

syncthing文件夹同步与版本管理

1 前言 syncthing可以用来同步文件夹里的所有文件&#xff0c;并且有不错的版本管理&#xff0c;基本每次更改文件&#xff0c;20-40秒就被扫描到了&#xff0c;非常丝滑&#xff1b;这次以此来同步obsidian的插件和文件&#xff0c;达到多端同步&#xff1b; 我家里有一台台…

Android HAL到Framework

一、为什么需要Framwork? Framework实际上是⼀个应⽤程序的框架&#xff0c;提供了很多服务&#xff1a; 1、丰富⽽⼜可扩展的视图&#xff08;Views&#xff09;&#xff0c; 可以⽤来构建应⽤程序&#xff0c;它包括列表&#xff08;lists&#xff09;&#xff0c;⽹格&am…

闲话 .NET(4):为什么要跨平台?

前言 .NET Core 有一个关键词就是跨平台&#xff0c;为什么要跨平台呢&#xff1f;Windows 操作系统不香吗&#xff1f;今天我们来聊聊这个 原因一&#xff1a;安全考虑 Windows OS 是闭源的&#xff0c;而 Linux 是开源的&#xff0c;因此有些公司的技术负责人就认为 Linux…

如何将老板的游戏机接入阿里云自建K8S跑大模型(下)- 安装nvidia/gpu-operator支持GPU在容器中共享

文章目录 安装nvidia/gpu-operator支持GPU在容器中共享 安装nvidia/gpu-operator支持GPU在容器中共享 安装 nvidia/gpu-operator遇到两个问题&#xff1a; 由于我们都懂的某个原因&#xff0c;导致某些镜像一直现在不成功。 解决办法&#xff0c;准备一个&#x1fa9c;&#…

车间人员作业行为智能检测 AI视觉在生产车间制造中的应用

车间人员作业行为智能检测系统基于神经网络人工智能视觉算法&#xff0c;车间人员作业行为智能检测通过对车间监控摄像头获取的视频图像进行分析和识别&#xff0c;实现了对人员操作行为的智能检测。系统对工人的操作环节进行分解&#xff0c;根据时间、动作标准等方面制定了规…

MemoryDB 2024 论文分享

论文地址点这里。 TL;DR MemoryDB 通过底层依赖 AWS 内部系统 Multi-AZ Transaction Log 实现了 11 个 9 的持久性保证。 通过依赖 Transaction Log 的 Condition API 和租约机制来实现了一致性和可用性保证。 通过周期性调度 Off-box 节点来外部 Rewrite binlog 避免了内存…

Linux技术分享:Linux设置软链接

简介 软连接是linux中一个常用命令&#xff0c;它的功能是为某一个文件在另外一个位置建立一个不同的链接&#xff0c;类似于windows的快捷方式。作用 当我们需要在不同的目录&#xff0c;使用到相同的文件时&#xff0c;我们不需要在每一个需要的目录下都放一个必须相同的文件…

C语言基础——循环(2)+关机程序

欢迎点赞支持 个人主页&#xff1a;励志不掉头发的内向程序员&#xff1b; 专栏主页&#xff1a;C语言基础&#xff1b; 文章目录 目录 前言 一、for循环的补充 二、循环的嵌套 1、嵌套的介绍 1.1 练习&#xff1a; 题目解析&#xff1a; 优化&#xff1a; 三、goto语句 1、go…

3DEXPERIENCE DELMIA Role: RFP - Fabrication Robot Programmer

Discipline: Robotics Role: RFP - Fabrication Robot Programmer 在虚拟工厂中定义、验证和编程机器人弧焊和密封剂沉积系统 模拟和验证完整的焊接、密封剂沉积和搬运机器人系统&#xff0c;以消除代价高昂的碰撞并优化生产率提供精确的生产就绪型机器人程序&#xff0c;同…

Day 38 防火墙技术IPtables

一&#xff1a;防火墙简介 1.简介 ​ iptables其实并不是真正的防火墙&#xff0c;我们可以把他理解为一个客户端的代理&#xff0c;用户是通过iptables这个代理&#xff0c;将用户的安全设定执行到对应的“安全框架”中&#xff0c;这个“安全框架”才是真正的防火墙。这个框…

mac安装Redis

官网&#xff1a; https://redis.io中文网&#xff1a; Redis中文网 安装 brew install redis 查看版本 redis-server --version 开启关闭服务 方式一&#xff08;不推荐&#xff09; 这种方式不太建议&#xff0c;因为控制台不用输出相应的日志 开启服务 brew service…

K8S认证|CKA题库+答案| 1. 权限控制RBAC

1、权限控制RBAC 您必须在以下Cluster/Node上完成此考题&#xff1a; Cluster Master node Worker node k8s master …

园区网的基本了解

园区网使用的典型技术---IEEE802.3标准/IEEE802.11标准 封闭式园区网络 ---由内部人员使用&#xff0c;不能访问互联网。 ---制订各式各样的规章制度 ---NAC&#xff0c;网络接入控制 开放式园区网络 ---服务于公众的&#xff0c;认证 园区网的发展 第一代&#xff1a;…

神经网络模型结构和参数可视化

神经网络模型结构和参数可视化 一、前言二、Netron2.1Netron简介2.2TensorFlow、Keras、Caffe模型文件实测结果2.3PyTorch、scikit-learn模型文件实测结果 三、NN-SVG四、Netscope五、PlotNeuralNet六、Graphviz七、总结参考文档 一、前言 在神经网络的某些应用场景中&#xf…

.NET快速实现网页数据抓取

网页数据抓取需求 本文我们以抓取博客园10天推荐排行榜第一页的文章标题、文章简介和文章地址为示例&#xff0c;并把抓取下来的数据保存到对应的txt文本中。 请求地址&#xff1a;https://www.cnblogs.com/aggsite/topdiggs 创建控制台应用 创建名为DotnetSpiderExercise的控…

Java通用三级菜单工具类

Java通用三级菜单工具类 通常在写三级菜单时会使用递归方式去写&#xff0c;但是时间长了会发现很多重复的代码一直在写&#xff0c;改&#xff0c;也就改几个名字。 实现方式 抽象属性结构 常用的三个字段&#xff0c;子级id、父级id、其次是数组children。 将返回对象或…

【Spring security】【pig】Note01-pig登录验证过程

&#x1f338;&#x1f338; pig 登录验证 &#x1f338;&#x1f338; pig后端源码 一、大概执行顺序&#xff0c;便于理解 pig spring-security 二、配置过滤器 配置SecurityFilterChain 三、执行过程分析 请求拦截&#xff1a; 当客户端发送请求时&#xff0c;Sprin…

Nginx反向代理与负载均衡:让网站像海豚一样灵活

引言&#xff1a;"当网站遇上海豚&#xff1a;Nginx让数据流动更流畅&#xff01;"想象一下&#xff0c;你的网站是一片繁忙的海域&#xff0c;而Nginx就像一群聪明的海豚&#xff0c;它们不仅能够迅速地找到最佳的捕食路线&#xff08;反向代理&#xff09;&#xf…