【TS学习】(23)理解类的双重角色

在 TypeScript 中,类(class)不仅是一个运行时的值(即可以实例化对象的构造函数),同时也是一个类型声明。具体来说,类在 TypeScript 中既声明了值,也声明了类型,并且它的类型分为两种:

  1. 实例化对象类型:描述通过 new 操作符创建的实例的结构。
  2. 类构造函数类型:描述类本身的结构(包括构造函数和静态成员)。

1. 类声明值

(1) 作为值
  • 在运行时,类是一个普通的 JavaScript 构造函数。
  • 它可以通过 new 关键字实例化对象。
示例
class User {name: string;constructor(name: string) {this.name = name;}greet(): void {console.log(`Hello, ${this.name}`);}
}// 使用类作为值
const user = new User("Alice");
user.greet(); // 输出 "Hello, Alice"

在这里:

  • User 是一个构造函数,可以在运行时通过 new 创建实例。

2. 类声明类型

(1) 实例化对象类型
  • 类本身也可以作为一个类型,用来描述通过 new 操作符创建的实例的结构。
  • 这种类型被称为实例化对象类型
示例
class User {name: string;constructor(name: string) {this.name = name;}greet(): void {console.log(`Hello, ${this.name}`);}
}// 使用类作为类型
function printUser(user: User): void {console.log(user.name);
}const alice = new User("Alice");
printUser(alice); // 输出 "Alice"

在这里:

  • User 被用作类型,表示 alice 的类型是 User 类的实例。

(2) 类构造函数类型
  • 类本身也有一个类型,称为类构造函数类型,它描述了类的静态成员和构造函数签名。
  • 这种类型可以通过 typeof ClassName 获取。
示例
class User {static defaultName: string = "Guest";name: string;constructor(name: string) {this.name = name;}greet(): void {console.log(`Hello, ${this.name}`);}
}// 使用类构造函数类型
function createUser(ctor: typeof User, name: string): User {return new ctor(name);
}const bob = createUser(User, "Bob");
bob.greet(); // 输出 "Hello, Bob"console.log(User.defaultName); // 输出 "Guest"

在这里:

  • typeof User 表示 User 类的构造函数类型。
  • createUser 函数接受一个类构造函数 ctor 和一个名称 name,并通过 new ctor(name) 创建实例。

3. 实例化对象类型与类构造函数类型的区别

特性实例化对象类型类构造函数类型
定义描述通过 new 创建的实例的结构。描述类本身的结构(包括静态成员)。
获取方式直接使用类名(如 User)。使用 typeof ClassName
用途用于限制实例的结构。用于限制类构造函数的结构。
示例const user: User = new User();const ctor: typeof User = User;

4. 综合示例

以下是一个综合示例,展示了如何同时使用实例化对象类型和类构造函数类型。

示例代码
class User {static defaultName: string = "Guest";name: string;constructor(name: string) {this.name = name || User.defaultName;}greet(): void {console.log(`Hello, ${this.name}`);}
}// 使用实例化对象类型
function printUser(user: User): void {console.log(user.name);
}// 使用类构造函数类型
function createUser(ctor: typeof User, name?: string): User {return new ctor(name);
}// 测试
const alice = new User("Alice");
printUser(alice); // 输出 "Alice"const guest = createUser(User);
guest.greet(); // 输出 "Hello, Guest"

在这里:

  • User 作为实例化对象类型,用于限制 printUser 函数的参数类型。
  • typeof User 作为类构造函数类型,用于限制 createUser 函数的第一个参数类型。

5. 高级用法:泛型与类类型

结合泛型和类类型,可以实现更灵活的设计。

示例:工厂函数
class Point {x: number;y: number;constructor(x: number, y: number) {this.x = x;this.y = y;}
}function createInstance<T>(ctor: new (...args: any[]) => T, ...args: any[]): T {return new ctor(...args);
}const point = createInstance(Point, 10, 20);
console.log(point.x, point.y); // 输出 10, 20

在这里:

  • createInstance 是一个通用的工厂函数,接受一个类构造函数和构造参数,返回类的实例。
  • new (...args: any[]) => T 是类构造函数类型的泛型约束。

6. 总结

  • 类声明值
    • 类是一个运行时的构造函数,可以通过 new 创建实例。
  • 类声明类型
    • 实例化对象类型:描述类实例的结构。
    • 类构造函数类型:描述类本身的结构(包括静态成员和构造函数签名)。
  • 区别
    • 实例化对象类型关注实例的属性和方法。
    • 类构造函数类型关注类的静态成员和构造函数。
  • 应用场景
    • 实例化对象类型用于限制实例的类型。
    • 类构造函数类型用于限制类的类型(如工厂函数)。

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

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

相关文章

IAP Firmware Upload Tools.exe IAP 网络固件升级教程

IAP是In Application Programming的简写&#xff0c;IAP升级可以被视为固件升级的一种形式,它是一种在应用程序运行过程中对固件进行更新的技术手段。允许MCU在运行过程中对MCU User Flash的部分区域进行烧写,目的是为了代替编程器对MCU烧录的依赖。 主程序UI 软件按钮说明&a…

Uniapp当中的async/await的作用

一、原始代码的行为&#xff08;使用 async/await&#xff09; const getUserMessagePlan async () > {// 等待两个异步操作完成const tabsList await message.getTagesList(); // 等待获取标签列表const tagsStateList await message.getTagsStateList(); // 等…

设计模式 Day 5:夯实观察者模式(Boost 实战精讲)

今天我们继续深入观察者模式的学习&#xff0c;不再局限于手写的抽象结构&#xff0c;而是聚焦于真实项目中如何使用成熟框架&#xff08;如 Boost.Signals2&#xff09;高效落地观察者模式。 本篇采用**“理论解析 问答讲解 实战用例”**结构&#xff0c;帮助你从设计思想到…

设计模式 Day 3:抽象工厂模式(Abstract Factory Pattern)详解

经过前两天的学习&#xff0c;我们已经掌握了单例模式与工厂方法模式&#xff0c;理解了如何控制实例个数与如何通过子类封装对象的创建逻辑。 今天&#xff0c;我们将进一步深入“工厂”体系&#xff0c;学习抽象工厂模式&#xff08;Abstract Factory Pattern&#xff09;&a…

MySQL:事务的理解

一、CURD不加控制&#xff0c;会有什么问题 &#xff08;1&#xff09;因为&#xff0c;MySQL里面存的是数据&#xff0c;所以很有可能会被多个客户访问&#xff0c;所以mysqld可能一次会接受到多个关于CURD的请求。&#xff08;2&#xff09;且mysql内部是采用多线程来完成数…

蓝桥杯刷题--宝石组合

在一个神秘的森林里&#xff0c;住着一个小精灵名叫小蓝。有一天&#xff0c;他偶然发现了一个隐藏在树洞里的宝藏&#xff0c;里面装满了闪烁着美丽光芒的宝石。这些宝石都有着不同的颜色和形状&#xff0c;但最引人注目的是它们各自独特的 “闪亮度” 属性。每颗宝石都有一个…

DAY06:【pytorch】图像增强

1、基本概念 数据增强&#xff0c;又称数据增广、数据扩增&#xff0c;是对训练集进行变换&#xff0c;使训练集更丰富&#xff0c;从而让模型更具泛化能力 2、裁剪 — — Crop 2.1 transforms.CenterCrop 功能&#xff1a;从图像中心裁剪图片 size&#xff1a;所需裁剪图…

mysql 禁止 读 某个 表

mysql 禁止 读 某个 表 mysql禁用某张表,禁用MySQL表的操作 https://shuyeidc.com/wp/89479.html MySQL严格禁止读取表如何避免数据泄露 https://www.kdun.cn/ask/394700.html select host,user from mysql.user; FLUSH PRIVILEGES; 1. MySQL严格禁止读取表如何避免数据泄露…

机器学习 从入门到精通 day_03

1. KNN算法-分类 1.1 样本距离判断 明可夫斯基距离&#xff1a;欧式距离&#xff0c;明可夫斯基距离的特殊情况&#xff1b;曼哈顿距离&#xff0c;明可夫斯基距离的特殊情况。 两个样本的距离公式可以通过如下公式进行计算&#xff0c;又称为欧式距离。 &#xff08;…

LeetCode 热题 100_零钱兑换(85_322_中等_C++)(动态规划)

LeetCode 热题 100_零钱兑换&#xff08;85_322&#xff09; 题目描述&#xff1a;输入输出样例&#xff1a;题解&#xff1a;解题思路&#xff1a;思路一&#xff08;动态规划&#xff09;&#xff1a; 代码实现代码实现&#xff08;思路一&#xff08;动态规划&#xff09;&a…

游戏盾IP可以被破解吗

游戏盾IP&#xff08;如上海云盾SDK、腾讯云游戏盾&#xff09;是专为游戏行业设计的高防服务&#xff0c;旨在抵御DDoS攻击、CC攻击等威胁。其安全性取决于​​技术架构、防护能力​​以及​​运维策略​​。虽然理论上没有绝对“无法破解”的系统&#xff0c;但游戏盾IP在合理…

SpringBoot实战1

SpringBoot实战1 一、开发环境&#xff0c;环境搭建-----创建项目 通过传统的Maven工程进行创建SpringBoot项目 &#xff08;1&#xff09;导入SpringBoot项目开发所需要的依赖 一个父依赖&#xff1a;&#xff08;工件ID为&#xff1a;spring-boot-starter-parent&#xf…

【软考-高级】【信息系统项目管理师】【论文基础】进度管理过程输入输出及工具技术的使用方法

定义 项目进度管理是为了保证项目按时完成&#xff0c;对项目中所需的各个过程进行管理的过程&#xff0c;包括规划进度、定义活动、活动优先级排序、活动持续时间、制定进度计划和控制进度。 管理基础 制定进度计划的一般步骤 选择进度计划方法&#xff08;如关键路径法&a…

【Linux】之【Get】 chroot 环境下安装deb包时 .postinst:行 9: 201 段错误 (核心已转储)ldconfig

背景 如题&#xff0c;在postinst文件中直接执行了ldconfig命令&#xff0c; chroot 环境下出错&#xff0c;安装失败 分析 chroot 环境下不能用 ldconfig 和 systemctl 但是&#xff1a;如果环境是 chroot&#xff0c;系统有可能没完整挂载 /proc、/dev、系统路径&#xff…

【论文精读与实现】EDC²-RAG:基于动态聚类的文档压缩方法提升检索增强生成RAG性能

🧠 向所有学习者致敬! “学习不是装满一桶水,而是点燃一把火。” —— 叶芝 我的博客主页: https://lizheng.blog.csdn.net 🌐 欢迎点击加入AI人工智能社区! 🚀 让我们一起努力,共创AI未来! 🚀 1. 论文核心思想 这篇由清华大学团队提出的EDC-RAG框架,针对当前…

OSPF接口的网络类型和不规则区域

网络类型(数据链路层所使用的协议所构建的二层网络类型) 1、MA --- 多点接入网络 BMA --- 支持广播的多点接入网络 NBMA --- 不支持广播的多点接入网络 2、P2P --- 点到点网络 以太网 --- 以太网最主要的特点是需要基于MAC地址进行物理寻址&#xff0c;主要是因为以太网接口所连…

HTTP代理:内容分发战场上的「隐形指挥官」

目录 一、技术本质&#xff1a;流量博弈中的「规则改写者」 二、战略价值&#xff1a;内容分发的「四维升级」 三、实战案例&#xff1a;代理技术的「降维打击」 四、未来进化&#xff1a;代理技术的「认知升级」 五、结语&#xff1a;代理技术的「战略觉醒」 在数字内容爆…

(2)网络学习之堡垒机

堡垒机和防火墙的区别&#xff1a; 1.功能定位 防火墙主要负责抵御外部攻击&#xff0c;就像一道坚固的城墙&#xff0c;防止黑客进入内部网络。堡垒机则专注于内部管理&#xff0c;监控和记录运维人员的操作行为&#xff0c;确保内部网络的安全。 2.部署位置与作用范围 防…

minio命令行客户端mc常见用法

安装minio命令行客户端mc https://min-io.cn/docs/minio/linux/reference/minio-mc-admin.html # Windows安装minio命令行客户端 choco install minio-client -y# Linux安装mc客户端 wget -c -P /usr/local/bin/ https://dl.min.io/client/mc/release/linux-amd64/mc # 赋予可…

idea调整控制台日志显示长度

概述 在调试时&#xff0c;idea控制台显示的日志有长度显示&#xff0c;当显示的日志太长时&#xff0c;后生成的日志会覆盖掉之前生成的日志内容。想要调整长度就可以按以下方式进行设置。 设置方法 Settings -> Editor -> General -> Console -> Override con…