【TypeScript】枚举类型和泛型的详细介绍

 

目录

枚举类型

TypeScript泛型介绍

🎲泛型的基本使用

🎲泛型接口的使用

🎲泛型类的使用

🎲泛型的类型约束

总结:

枚举类型(Enum)详细介绍

定义枚举类型

使用枚举类型

注意事项

泛型(Generics)详细介绍

基本语法

泛型类和接口

泛型约束


枚举类型

枚举类型是为数不多的TypeScript特有的特性之一, JavaScript是没有的

枚举其实就是将一组可能出现的值,一个个列举出来,定义在一个类型中,这个类型就是枚举类型;

枚举允许开发者定义一组命名常量,常量可以是数字、字符串类型;

枚举类型使用enum关键字定义, 建议枚举中定义的值使用大写

枚举我们常见的使用方式如下

enum Direction {LEFT,RIGHT,TOP,BOTTOM
}function turnDirection(direction: Direction) {switch (direction) {case Direction.LEFT:console.log("转向左边")break;case Direction.RIGHT:console.log("转向右边")break;case Direction.TOP:console.log("转向上边")break;case Direction.BOTTOM:console.log("转向下边")break;default:const foo: never = directionbreak;}
}// 测试
turnDirection(Direction.LEFT)
turnDirection(Direction.RIGHT)
turnDirection(Direction.TOP)
turnDirection(Direction.BOTTOM)

枚举类型默认是有值的,比如上面代码的枚举,默认值其实是这样的

enum Direction {LEFT = 0,RIGHT = 1,TOP = 2,BOTTOM = 3
}

当然,我们也可以给枚举其他值, 比如我们给LEFT一个值: 100

enum Direction {LEFT = 100,RIGHT,TOP,BOTTOM
}

这个时候LEFT后面的值如果没有设置值的话, 它们的默认值会从100进行递增, 相当于下面这样:

enum Direction {LEFT = 100,RIGHT = 101,TOP = 102,BOTTOM =103
}

我们也可以给他们赋值其他的类型

enum Direction {LEFT,RIGHT,TOP = "TOP",BOTTOM = "BOTTOM"
}

TypeScript泛型介绍

🎲泛型的基本使用

软件工程的主要目的是构建不仅仅明确和一致的API,还要让你的代码具有很强的可重用性

比如我们可以通过函数来封装一些API,通过传入不同的函数参数,让函数帮助我们完成不同的操作;

但是对于参数的类型是否也可以参数化呢?

什么是类型的参数化?

我们来提一个需求:封装一个函数,传入一个参数,并且返回这个参数;

如果我们是TypeScript的思维方式,要考虑这个参数和返回值的类型需要一致

// 传入number类型, 返回number类型
function foo(arg: number): number {return arg
}

上面的代码虽然实现了,但是不适用于其他类型,比如string、 boolean、 Person等其他类型

为了适用于其他类型, 我们可以定义为any类型

// 传入number类型, 返回number类型
function foo(arg: any): any {return arg
}

 

虽然any是可以的,但是定义为any的时候,我们其实已经丢失了类型信息

比如我们传入的是一个number,那么返回的也是是any类型, 我们并不是希望它返回number类型,我们希望返回number类型;

我们想要做到在函数中可以捕获到参数的类型是number,并且同时使用它来作为返回值的类型;

我们需要在这里使用一种特性的变量 - 类型变量( type variable),它作用于类型,而不是值

我们可以将它看做额外的一个参数;

它可以做到, 在定义这个函数时, 不决定这些参数的类型, 而是让调用者以参数的形式告知, 这里的函数参数应该是什么类型

function foo<Type>(arg: Type): Type {return arg
}

这里我们可以使用两种方式来调用它

  • 方式一:通过 <类型> 的方式将类型传递给函数;
foo<number>(123) // 传入number类型
foo<{name: string}>({ name: "chenyq" }) // 传入有name属性的对象类型
foo<number[]>([10, 20]) // 传入number类型的数组
  • 方式二:通过类型推导,自动推导出我们传入变量的类型:

在这里会推导出它们是字面量类型的,因为字面量类型对于我们这个函数也是适用的

foo(50)
foo("aaa")
foo({ name: "kaisa" })

 当然我们也可以传入多个类型

function foo<T, E>(arg1: T, arg2: E) {console.log(arg1, arg2)
}foo<number, string>(123, "abc")

平时在开发中我们可能会看到一些常用的名称

T: Type的缩写,类型

K、 V: key和value的缩写,键值对

E: Element的缩写,元素

O: Object的缩写,对象

🎲泛型接口的使用

在定义接口的时候我们也可以使用泛型

// 定义泛型接口
interface IPerson<T1, T2> {name: T1age: T2
}const p: IPerson<string, number> = {name: "chenyq",age: 18
}

泛型接口是没有类型推导的, 但是可以有默认值类型的

// 泛型接口定义默认类型
interface IPerson<T1 = string, T2 = number> {name: T1age: T2
}const p: IPerson = {name: "chenyq",age: 123
}
🎲泛型类的使用

我们也可以编写一个泛型类


class Point<T> {x: Ty: Tz: Tconstructor(x: T, y: T, z: T) {this.x = xthis.y = ythis.z = z}
}// 泛型类是可以自动推导类型的
const p1 = new Point("1.22", "3.56", "7.32")
// 也可以自己指定类型, 有下面两种方式
const p2 = new Point<number>(10, 20, 30)
const p3: Point<string> = new Point("1.22", "3.56", "7.32")
🎲泛型的类型约束

有时候我们希望传入的类型有某些共性,但是这些共性可能不是在同一种类型中

比如string和array都是有length的,或者某些对象也是会有length属性的, 但是此时使用泛型, 编译阶段是会报错的, 因为不能保证泛型的所有类型都是有length属性的; 

那么只要是拥有length的属性都可以作为我们的参数类型,而没有length属性的不允许作为参数, 那么应该如何操作呢?

我们可以使用接口定义一个对象类型, 对象类型要求必须有length属性, 在让泛型继承自这个接口

interface ILength {length: number
}// 泛型继承自接口
function getLength<T extends ILength>(arg: T) {console.log(arg.length)
}// 测试
// getLength(123) // 123没有length无法传入
getLength("abc") // 3
getLength([10, 20, 30]) // 3
getLength({ length: 10 }) // 10

总结:

枚举类型(Enum)详细介绍

在 TypeScript 中,枚举类型(Enum)用于定义一组命名的常量。枚举通过使用标识符来引用每个常量,并且可以具有相关联的数值。以下是枚举类型的详细介绍:

定义枚举类型
enum Direction {Up = 1,Down,Left,Right,
}

以上代码定义了一个名为 Direction 的枚举类型,它包含四个常量:UpDownLeftRight。每个常量可以关联一个数值,默认情况下从 0 开始。

使用枚举类型
let userDirection: Direction = Direction.Up;
console.log(userDirection); // 输出 1

在这个示例中,我们声明了一个变量 userDirection,并将其赋值为 Direction.Up。这样就可以使用枚举类型中定义的常量来代表相应的数值。

注意事项
  • TypeScript 中的枚举类型可以是数字枚举或字符串枚举。
  • 数字枚举会自动增长成员的值,而字符串枚举的每个成员都必须被初始化。
  • 枚举类型可以作为参数传递给函数,以及与其他枚举类型进行比较。

泛型(Generics)详细介绍

泛型是 TypeScript 中非常强大和灵活的特性,它允许创建可重用的组件,能够在多种数据类型上进行操作而不失去类型安全性。以下是泛型的详细介绍:

基本语法
function identity<T>(arg: T): T {return arg;
}

以上代码定义了一个简单的泛型函数 identity,它接受一个类型为 T 的参数,并返回相同的类型。在调用时,编译器会根据传入的实际参数推断出 T 的具体类型。

泛型类和接口
interface GenericIdentityFn<T> {(arg: T): T;
}class GenericNumber<T> {zeroValue: T;add: (x: T, y: T) => T;
}

除了函数外,泛型还可以应用于类和接口。在上面的示例中,我们定义了一个泛型接口 GenericIdentityFn 和一个泛型类 GenericNumber,它们都能够适用于不同类型的数据。

泛型约束
interface Lengthwise {length: number;
}function loggingIdentity<T extends Lengthwise>(arg: T): T {console.log(arg.length);return arg;
}

通过使用泛型约束,我们可以限定泛型类型只能是满足特定条件的类型。在上面的示例中,loggingIdentity 函数要求泛型类型必须包含一个名为 length 的属性。

总之,枚举类型和泛型分别提供了在 TypeScript 中定义一组常量和编写可重用的通用代码的方式。它们都能够提高代码的可读性、灵活性和安全性,是 TypeScript 中值得深入学习和应用的重要特性。

 

 

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

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

相关文章

思维导图软件 Xmind mac中文版特点介绍

XMind 2022 mac是一款思维导图软件&#xff0c;可以帮助用户创建各种类型的思维导图和概念图。 XMind mac软件特点 - 多样化的导图类型&#xff1a;XMind提供了多种类型的导图&#xff0c;如鱼骨图、树形图、机构图等&#xff0c;可以满足不同用户的需求。 - 强大的功能和工具&…

python爬虫代理ip关于设置proxies的问题

目录 前言 一、什么是代理IP? 二、为什么需要设置代理IP? 三、如何设置代理IP? 四、完整代码 总结 前言 在进行Python爬虫开发时&#xff0c;经常会遇到被封IP或者频繁访问同一网站被限制访问等问题&#xff0c;这时&#xff0c;使用代理IP就可以避免这些问题&#x…

轻松搭建Linux宝塔面板并实现公网访问Discuz论坛,让您的论坛更具吸引力

文章目录 前言1.安装基础环境2.一键部署Discuz3.安装cpolar工具4.配置域名访问Discuz5.固定域名公网地址6.配置Discuz论坛 前言 Crossday Discuz! Board&#xff08;以下简称 Discuz!&#xff09;是一套通用的社区论坛软件系统&#xff0c;用户可以在不需要任何编程的基础上&a…

ubuntu 23.04从源码编译安装rocm运行tensorflow-rocm

因为ubuntu22.04的RDP不支持声音转发&#xff0c;所以下载了ubuntu23.04.但官方的rocm二进制包最高只支持ubuntu22.04&#xff0c;不支持ubuntu 23.04&#xff0c;只能自己从源码编译虽然有网友告诉我可以用docker运行rocm。但是我已经研究了好几天&#xff0c;沉没成本太多&am…

Jupyter Notebook的下载安装与使用教程_Python数据分析与可视化

Jupyter Notebook的下载安装与使用 Jupyter简介下载与安装启动与创建NotebookJupyter基本操作 在计算机编程领域&#xff0c;有一个很强大的工具叫做Jupyter。它不仅是一个集成的开发环境&#xff0c;还是一个交互式文档平台。对于初学者来说&#xff0c;Jupyter提供了友好的界…

Go 理解零值

在 Go 语言中&#xff0c;零值&#xff08;Zero Value&#xff09;是指在声明变量但没有显式赋值的情况下&#xff0c;变量会被自动赋予一个默认值。这个默认值取决于变量的类型&#xff0c;不同类型的变量会有不同的零值。零值是 Go 语言中的一个重要概念&#xff0c;因为它确…

二进制的形式在内存中绘制一个对象实例

一、引用类型实例的内存布局 从内存布局的角度来看&#xff0c;一个引用类型的实例由如下图所示的三部分组成&#xff1a;ObjHeader TypeHandle Fields。前置的ObjHeader用来缓存哈希值和同步状态&#xff0c;TypeHandle部分存储类型对应方法表&#xff08;Method Table&…

简单的用Python实现一下,采集某牙视频,多个视频翻页下载

前言 表弟自从学会了Python&#xff0c;每天一回家就搁那爬视频&#xff0c;不知道的以为是在学习&#xff0c;结果我昨天好奇看了一眼&#xff0c;好家伙&#xff0c;在那爬某牙舞蹈区&#xff0c;太过分了&#xff01; 为了防止表弟做坏事&#xff0c;我连忙找了个凳子坐下&…

Excel Unix时间戳和日期时间格式的相互转换

时间戳转日期时间 ((A18*3600)/86400)DATE(1970,1,1) # 或 (A18*3600)/8640070*36519# 带格式化 TEXT((C18*3600)/8640070*36519,"yyyy-mm-dd hh:mm:ss")首先加8小时进行时区转换&#xff0c;然后转换成天数&#xff0c;再加上1970年1月1日&#xff0c;最后设置日期…

人工智能基础_机器学习039_sigmoid函数_逻辑回归_逻辑斯蒂回归_分类神器_代码实现逻辑回归图---人工智能工作笔记0079

逻辑斯蒂回归(Logistic Regression)是一种常用的分类算法,其基本思想是通过拟合一个逻辑斯蒂函数来预测样本所属的类别。它广泛应用于各个领域,如医学、金融、市场营销等,具有较好的解释性和可解释性。在逻辑斯蒂回归中,我们通常使用的是二分类问题,即样本只属于两个类别…

限制Domain Admin登录非域控服务器和用户计算机

限制Domain Admin管理员使用敏感管理员帐户(域或林中管理员组、域管理员组和企业管理员组中的成员帐户)登录到信任度较低的服务器和用户端计算机。 此限制可防止管理员通过登录到信任度较低的计算机来无意中增加凭据被盗的风险。 建议采用的策略 建议使用以下策略限制对信任度…

在node-red 的function中使用第三方的npm 库来处理业务逻辑

首先找到node-red的安装目录,这个目录可以在启动日志里看到。 如我的 我的就是在 /Users/fizz/.node-red 进入该目录,安装所需要的库 如 npm install lodash 然后在setting.js 中配置functionGlobalContext // The following property can be used to seed Global Context …

tsconfig.json无法写入文件“XXXX“因为它会覆盖输入文件

在开发ts项目的时候&#xff0c;包错提示无法写入文件&#xff1a; tsconfig.json无法写入文件"XXXX"因为它会覆盖输入文件 这是tsconfig.json文件配置问题&#xff0c;需要加入下面的配置就好了&#xff1a; {"compilerOptions": {"outDir": …

《C++避坑神器·二十》C++智能指针简单使用

智能指针&#xff0c;自动释放所指向的对象。 头文件 #include <memory>shared_ptr 允许多个指针指向同一个对象 unique_ptr 独占所指向的对象 weak_ptr 指向shared_ptr所管理的对象 作用原理&#xff1a;在函数作用域结束时调用析构函数自动释放资源。 shared_ptr: …

Digicert证书:您的网络安全守护神

在当今数字化的世界中&#xff0c;网络安全已经成为每一个企业和个人必须面对的问题。而Digicert品牌证书&#xff0c;就是您网络安全的最佳选择。它不仅具有强大的安全性和稳定性&#xff0c;还能广泛应用于各种场景&#xff0c;为您提供全方位的保护。 首先&#xff0c;我们要…

Excel-快速将公式运用到一整列

先在该列的第一个单元格里写好公式&#xff0c;然后单击该单元格 在图中标示的地方输入我们需要填充的单元格区域 同时按住Ctrl和Enter键&#xff0c;这时需要填充的单元格区域就都被选中了 然后单击一下图中公式的后面&#xff0c;再次按下Ctrl和Enter键&#xff0c;这样就完…

短视频ai剪辑分发账号矩阵系统(招商oem)----源头技术开发

短视频ai剪辑分发账号矩阵系统 1. 视频剪辑工具——原创短视频一键生成&#xff0c;视频剪辑亮点分析 &#xff08;1&#xff09;多模式智能剪辑 包含智能混剪逻辑、智能组合、场景顺序、图片生成视频等多种模式。在视频创作上也做了简化&#xff0c;即使是没有剪辑能力的创…

ai剪辑矩阵系统源码+无人直播系统源码技术开发

开发AI剪辑矩阵系统和无人直播系统源码&#xff0c;需要以下步骤&#xff1a; 1. 市场调研&#xff1a;了解市场需求和竞品情况&#xff0c;明确系统的功能和特点。 2. 系统设计&#xff1a;设计系统的整体架构和功能模块&#xff0c;包括视频剪辑、直播推流、实时互动、数据分…

C#,数值计算——插值和外推,Base_interp的计算方法与源程序

1 文本格式 using System; namespace Legalsoft.Truffer { /// <summary> /// Abstract base class used by all interpolation routines in this chapter. /// Only the routine interp is called directly by the user. /// </summary> pu…

asp.net网上书店管理系统VS开发sqlserver数据库web结构c#编程计算机网页源码项目

一、源码特点 asp.net网上书店管理系统 是一套完善的web设计管理系统&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 asp.net网上书店系统1 二、功能介绍 本系统使用Microsoft Visual Studio 2019为开发工具&#xff0c;SQL Server为…