TypeScript 迭代器与装饰器

TypeScript 作为 JavaScript 的一个超集,提供了许多高级特性来增强代码的可读性、可维护性和类型安全性。在本文中,我们将探讨两个这样的特性:迭代器和装饰器。迭代器允许我们以一致的方式遍历数据集合,而装饰器则提供了一种特殊的方式来修改类的行为。

迭代器(Iterators)

迭代器是一种允许我们遍历集合对象的接口。在 TypeScript 中,迭代器是实现了 Iterable 接口的对象。这意味着对象可以被 for...of 循环迭代。

基本语法

var array = ['a', 'b', 'c'];
for (let item of array) {console.log(item);
}

在这个例子中,数组 array 是一个可迭代对象,我们可以使用 for...of 循环来迭代数组中的每个元素。

索引迭代

除了使用迭代器外,我们还可以使用传统的 for...in 循环来迭代数组的索引。

for (const index in array) {console.log(index);
}

这将输出数组中每个元素的索引。

自定义迭代器

我们可以创建自定义的迭代器来遍历我们自己的数据结构。

class MyIterable {*[Symbol.iterator]() {for (let i = 0; i < 3; i++) {yield i;}}
}const myIterable = new MyIterable();
for (let item of myIterable) {console.log(item);
}

在这个例子中,我们定义了一个 MyIterable 类,它有一个自定义的迭代器,使用 yield 关键字来生成值。

装饰器(Decorators)

装饰器是一种特殊类型的声明,它能够被附加到类声明、方法、访问符、属性或参数上。装饰器使用 @expression 这种形式,其中 expression 求值后必须为一个函数,它会在运行时被调用。

类装饰器

类装饰器在类构造函数执行之前被调用。

function classConstructorLog(constructor: Function) {console.log("装饰器被调用", constructor);return class extends constructor {other = 'other';};
}@classConstructorLog
class MyObject {data: string;constructor() {this.data = "data";console.log("My Object的构造函数");}
}var obj = new MyObject();
console.log(obj);

在这个例子中,classConstructorLog 是一个类装饰器,它在 MyObject 类的构造函数执行之前被调用。

方法装饰器

方法装饰器在方法被定义之前被调用。

function helloWorld(target: any, propertyKey: string, desc: PropertyDescriptor) {console.log("helloWorld");console.log(target, propertyKey, desc);
}class People {@helloWorldsayHi() {console.log("Hi");}
}var p = new People();
p.sayHi();

在这个例子中,helloWorld 是一个方法装饰器,它在 People 类的 sayHi 方法被定义之前被调用。

属性装饰器

属性装饰器在属性被定义之后被调用。

function logFunction(target: any, propertyKey: string, descriptor: PropertyDescriptor) {console.log("logFunction");console.log(target, propertyKey, descriptor);descriptor.writable = false;
}class Rect {private _width: number = 0;@logFunctionset width(w: number) {this._width = w;}
}

在这个例子中,logFunction 是一个属性装饰器,它在 Rect 类的 width 属性被定义之后被调用。

结论

迭代器和装饰器是 TypeScript 提供的两个强大的特性,它们允许我们以更灵活和强大的方式来编写代码。迭代器提供了一种一致的方式来遍历数据集合,而装饰器则提供了一种特殊的方式来修改类和方法的行为。这些特性使得 TypeScript 成为一个功能丰富的语言,适合用于大型和复杂的应用程序开发。

希望这篇文章能帮助你更好地理解和使用 TypeScript 的迭代器和装饰器。如果你有任何问题或想要进一步探讨,欢迎在评论区留下你的想法!

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

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

相关文章

浏览器的数据六种存储方法比较 :LocalStorage vs. IndexedDB vs. Cookies vs. OPFS vs. WASM-SQLite

在构建该 Web 应用程序&#xff0c;并且希望将数据存储在用户浏览器中。也许您只需要存储一些小标志&#xff0c;或者甚至需要一个成熟的数据库。 我们构建的 Web 应用程序类型发生了显着变化。在网络发展的早期&#xff0c;我们提供静态 html 文件。然后我们提供动态渲染的 h…

flutter in_app_purchase google支付 PG-GEMF-01错误

问题&#xff1a;PG-GEMF-01错误 flutter 使用in_app_purchase插件升降级订阅时报错PG-GEMF-01。 解决方案&#xff1a; 升降级订阅时&#xff0c;确保不调用 MethodCallHandlerImpl.java文件中的 setObfuscatedAccountId()方法、setObfuscatedProfileId()方法 原因&#xf…

Docker 容器隔离关键技术:Capabilities

Docker 容器隔离关键技术&#xff1a;Capabilities 在 Docker 中&#xff0c;Capabilities 是一种权限管理技术&#xff0c;它将 Linux 系统中传统的超级用户&#xff08;root&#xff09;权限拆分为多个独立的小权限&#xff08;目前为 38 项&#xff09;。这使得我们可以为容…

蓝桥杯备赛笔记(一)

这里的笔记是关于蓝桥杯关键知识点的记录&#xff0c;有别于基础语法&#xff0c;很多内容只要求会用就行&#xff0c;无需深入掌握。 文章目录 前言一、编程基础1.1 C基础格式和版本选择1.2 输入输出cin和cout&#xff1a; 1.3 string以下是字符串的一些简介&#xff1a;字符串…

【Redis】Redis介绍

目录 1.Redis是什么? 2. Redis特性 2.1 速度快 2.2 基于键值对的数据结构服务器 2.3 丰富的功能 2.4 简单稳定 2.5 客户端语言多 2.6 持久化 2.7 主从复制 2.8 高可用和分布式 3. Redis使用场景 3.1 缓存(Cache) 3.2 排行榜系统 3.3 计数器应用 3.4 社交网络 …

Redis使用场景-缓存-缓存穿透

前言 之前在针对实习面试的博文中讲到Redis在实际开发中的生产问题&#xff0c;其中缓存穿透、击穿、雪崩在面试中问的最频繁&#xff0c;本文加了图解&#xff0c;希望帮助你更直观的了解缓存穿透&#x1f600; &#xff08;放出之前写的针对实习面试的关于Redis生产问题的博…

STM32 ADC --- 多通道序列采样

STM32 ADC — 序列通道采样 文章目录 STM32 ADC --- 序列通道采样CubeMX配置代码编写总结 CubeMX配置 使用cubeMX生成HAL工程 扫描模式在配置多个通道时会自动变为Enable&#xff0c;这里需要注意的是需要将连续转换模式配置为Disable&#xff0c;将结束转换选择选择为每个通道…

树莓派2安装jupyterlab以便更好的编程体验

树莓派2 是一款很老的开发板了&#xff0c;但是它还能继续战斗。为了更好的编程体验&#xff0c;准备安装jupyterlab 安装jupyterlab 使用命令&#xff1a; pip install jupyterlab 该过程非常漫长&#xff0c;因为树莓派2是很老的板子&#xff0c;它需要安装一些arm7版本的…

C语言数据结构——详细讲解《队列》

C语言数据结构——详细讲解《队列》 前言一、队列的概念二、队列的操作&#xff08;一&#xff09;定义队列结构&#xff08;二&#xff09;初始化队列&#xff08;三&#xff09;入队列操作&#xff08;四&#xff09;出队列操作&#xff08;五&#xff09;获取队头元素&#…

【游资悟道】-作手新一悟道心法

作手新一经典语录节选&#xff1a; 乔帮主传完整版&#xff1a;做股票5年&#xff0c;炼成18式&#xff0c;成为A股低吸大神&#xff01;从小白到大神&#xff0c;散户炒股的六个过程&#xff0c;不看不知道自己水平 围着主线做&#xff0c;多研究龙头&#xff0c;研究涨停&am…

2025年入职/转行网络安全,该如何规划?网络安全职业规划

网络安全是一个日益增长的行业&#xff0c;对于打算进入或转行进入该领域的人来说&#xff0c;制定一个清晰且系统的职业规划非常重要。2025年&#xff0c;网络安全领域将继续发展并面临新的挑战&#xff0c;包括不断变化的技术、法规要求以及日益复杂的威胁环境。以下是一个关…

使用pymupdf提取PDF文档中的文字和其颜色

最近我在捣鼓一个PDF文件&#xff0c;想把它里面的文字和文字颜色给提取出来。后来发现有个叫pymupdf的库能搞定这事儿。操作起来挺简单的&#xff0c;pymupdf的示例文档里就有现成的代码可以参考。 how-to-extract-text-with-color 我本地的测试代码如下&#xff1a; impor…

Java 中的栈、队列

Java 中的栈、队列和双端队列 Java 提供了多种类和接口支持栈、队列和双端队列的实现。 Stack \texttt{Stack}Stack 类是早期版本的栈的实现类&#xff0c;继承自 Vector \texttt{Vector}Vector 类。在后续版本中&#xff0c;JDK 的官方文档不建议使用 Stack \texttt{Stack}St…

《企业级低代码开发平台技术要求》核心要点解析

一、引言 在数字化转型的浪潮中&#xff0c;企业级低代码开发平台成为推动企业创新与发展的关键力量。深圳市标准化协会发布的《企业级低代码开发平台技术要求》&#xff08;T/SZAS 77—2024&#xff09;为该领域提供了重要的规范与指引。深入剖析其核心要点&#xff0c;对于理…

STM32 + CubeMX + 串口 + IAP升级

这篇文章分享一个简单的串口IAP Demo&#xff0c;实现使用串口更新我们自己的App程序。 目录 一、IAP简介二、Stm32CubeMx配置三、Boot代码及配置1、代码2、配置 四、App代码及配置1、代码2、配置 五、效果展示 一、IAP简介 IAP介绍可以在网上找找&#xff0c;相关资料很多&am…

A051-基于Spring Boot的网络海鲜市场系统的设计与实现

&#x1f64a;作者简介&#xff1a;在校研究生&#xff0c;拥有计算机专业的研究生开发团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339; 赠送计算机毕业设计600…

《String类》

目录 一、定义与概述 二、创建字符串对象 2.1 直接赋值 2.2 使用构造函数 三、字符串的不可变性 四、常用方法 4.1 String对象的比较 4.1.1 比较是否引用同一个对象 4.1.2 boolean equals(Object anObject)方法&#xff1a;按照字典序比较 4.1.3 int compareTo(Strin…

【python使用kazoo连ZooKeeper基础使用】

from kazoo.client import KazooClient, KazooState from kazoo.exceptions import NoNodeError,NodeExistsError,NotEmptyError import json# 创建 KazooClient 实例&#xff0c;连接到 ZooKeeper 服务器 zk KazooClient(hosts127.0.0.1:2181) zk.start()# 定义节点路径 path…

I/O流综合练习题

(1)要编写一个dog.properties nametom age5 colorred (2)编写Dog 类(name,age,color)创建一个dog对象&#xff0c;读取dog.properties 用相应的内容完 成属性初始化,并输出 (3)将创建的Dog 对象 &#xff0c;序列化到 文件 dog.dat 文件 package chapter19.Properties;import …

vue多页面应用集成时权限处理问题

在多页面应用&#xff08;MPA&#xff09;中&#xff0c;权限管理通常会涉及到每个页面的访问控制、身份验证、以及权限校验。以下是几种常见的权限处理方式&#xff1a; 1. 前端路由权限控制 原理&#xff1a;虽然是多页面应用&#xff0c;通常每个页面会独立加载和渲染&…