一文理解TS泛型
当我们在编写 TypeScript 代码时,经常会遇到需要通用(Generic)的情况,这时候,泛型就是我们的好帮手了。在本篇文章中,我们将深入介绍 TypeScript 泛型的概念以及如何使用。
什么是泛型?
在编程语言中,泛型指的是参数化类型的概念。也就是说,我们可以定义一个函数、接口或类等,能够处理不同类型的数据,而不是只能处理一种类型的数据。这使得我们的代码更加灵活、通用、可复用。
下面是一个简单的泛型函数的例子:
function identity<T>(arg: T): T {
return arg;
}
let output = identity<string>("hello world");
console.log(output); // 输出 hello world
上面这个函数用于返回的值与传入的参数类型相同,这类函数通常称为 Identity 函数。这里使用了 <T> 来代表泛型类型,在函数声明时,我们用具体类型替换了 <T>,使得函数可以处理任意类型的数据。
泛型类
我们也可以编写在类中使用泛型的代码。下面是一个简单的例子:
class Queue<T> {
private list: T[] = [];
push(item: T) {
this.list.push(item);
}
pop() {
return this.list.shift();
}
}
let queue = new Queue<string>();
queue.push("first element");
queue.push("second element");
console.log(queue.pop()); // 输出 first element
console.log(queue.pop()); // 输出 second element
在这个例子中,我们定义了一个 Queue 类,它使用了泛型类型 T,表示队列中元素的类型。我们可以通过调用 push() 和 pop() 方法来添加和移除元素。
泛型类型约束
有时候,我们希望泛型所代表的类型必须满足一定的条件,这个时候我们可以通过添加类型约束来实现。下面是一个简单例子:
interface Lengthwise {
length: number;
}
function loggingIdentity<T extends Lengthwise>(arg: T): T {
console.log(arg.length);
return arg;
}
loggingIdentity("hello"); // 输出 5
在上面的例子中,我们定义了一个泛型函数 loggingIdentity,它接受一个参数 arg,该参数的类型必须是一个具有 length 属性的对象。我们通过 extends 关键字来实现类型约束。
在泛型中使用类型别名
在 TypeScript 中,我们还可以使用类型别名来定义泛型类型。下面是一个简单的例子:
type Coordinate = [number, number];
function distance(a: Coordinate, b: Coordinate): number {
const [x1, y1] = a;
const [x2, y2] = b;
return Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2));
}
console.log(distance([0, 0], [3, 4])); // 输出 5
在上面的例子中,我们定义了一个类型别名 Coordinate,它是一个元组类型,包含两个数字。然后我们定义了一个 distance 函数,它接受两个 Coordinate 类型的参数,并计算两点之间的距离。
总结
在本篇文章中,我们深入介绍了 TypeScript 中泛型的概念,以及提供了一些实际应用的例子。泛型是一个非常强大且常用的特性,它可以使我们的代码更加通用、灵活以及可复用。希望通过本篇文章的介绍,你能够更加深入地理解 TypeScript 中的泛型。
一文理解TS泛型的更多相关文章
- Java 基础 一文搞懂泛型
本文将从以下四个方面来系统的讲解一下泛型,基本上涵盖了泛型的主体内容. 什么是泛型? 为什么要使用泛型? 如何使用泛型? 泛型的特性 1. 什么是泛型? 泛型的英文是Generics,是指在定义方法. ...
- 理解C#泛型(转)
理解C#泛型 http://www.cnblogs.com/wilber2013/p/4292240.html 泛型中的类型约束和类型推断 http://www.cnblogs.com/wilber2 ...
- Java 干货之深入理解Java泛型
一般的类和方法,只能使用具体的类型,要么是基本类型,要么是自定义的类.如果要编写可以应用多中类型的代码,这种刻板的限制对代码得束缚会就会很大. ---<Thinking in Java> ...
- 一文理解Cookie、Session
一文理解Cookie.Session 1.什么是会话 用户打开浏览器,点击多个超链接,访问服务器的多个web资源,然后关闭浏览器,整个过程就称为一个会话: HTTP 是无状态,有会话的 HTTP 是无 ...
- 一文理解什么是DevOps,通俗易懂白话文
一文理解什么是DevOps,通俗易懂白话文 devops是什么❝DevOps维基百科定义 DevOps(Development和Operations的组合词)是一种重视"软件开发人员(Dev ...
- 如何理解 TS 类型编程中的 extends 和 infer
extends extends 在TS类型编程中用法(T extends U),表示 T 中的某些在 U 里面,比较难描述,用法如下: T extends U ? X : Y 分为两种情况理解更直观一 ...
- TS 泛型推断好难啊,看看你能写出来不
前言 最近做东西都在用ts,有时候写比较复杂的功能,如果不熟悉,类型写起来还是挺麻烦的.有这样一个功能,在这里,我们就不以我们现有的业务来举例了,我们还是已Animal举例,来说明场景.通过一个工厂来 ...
- 深入理解C#泛型
前面两篇文章介绍了C#泛型的基本知识和特性,下面我们看看泛型是怎么工作的,了解一下泛型内部机制. 泛型内部机制 泛型拥有类型参数,通过类型参数可以提供"参数化"的类型,事实上,泛型 ...
- 理解C#泛型
在C# 2.0中引入了泛型,泛型的出现解决了编码中的很多问题.相信大家一定经常用到"System.Collections.Generic"命名空间中的泛型集合类("Gen ...
- 转:理解Java泛型
JDK 5.0 中增加的泛型类型,是 Java 语言中类型安全的一次重要改进.但是,对于初次使用泛型类型的用户来说,泛型的某些方面看起来可能不容易明白,甚至非常奇怪.在本月的“Java 理论和实践”中 ...
随机推荐
- SQLServer数据库执行时间
with kk AS( SELECT TOP 2000 total_worker_time/1000 AS [总消耗CPU 时间(ms)],execution_count [运行次数], qs.tot ...
- PASS模型小程序设计阶段-里程碑第三组
班级网址 https://edu.cnblogs.com/campus/zjcsxy/SE2020 作业要求 https://edu.cnblogs.com/campus/zjcsxy/SE2020/ ...
- Nginx版本。
Nginx官网提供了三个类型的版本Mainline version:Mainline 是 Nginx 目前主力在做的版本,可以说是开发版Stable version:最新稳定版,生产环境上建议使用的版 ...
- KERNEL1
WHAT IS KERNEL KERNEL是一个负责连接计算机硬件与软件的一个模块,当软件对硬件进行调用的时候,或者发送一些置零的时候,KERNEL负责将这些指令转化并发送给CPU或者计算机中其他硬件 ...
- 在win10上装vmware虚拟机+ubuntu一打开就蓝屏重启怎么办?
一般就是虚拟机和系统一些性能不兼容导致的 因为我原来装的版本是15.0的vmware,现在重新装了16的vmware
- [转]常见的视频编码详解 Cinepak Codec by Radius
AVI所采用的压缩算法并无统一的标准.也就是说,同样是以AVI为后缀的视频文件,其采用的压缩算法可能不同,需要相应的解压软件才能识别和回放该AVI文件.除了Microsoft公司之外,其他公司也推出了 ...
- SpringBoot笔记--自动配置(高级内容)(中集)
@Enable*注解 使用该注解,需要导入相应的依赖坐标,其中的groupId标签里面写入Bean的Java文件所在的包的路径下面 spring-enable-other 还需要在SpringBoot ...
- Java线程池和Spring异步处理高级篇
开发过程中我们会遇到很多使用线程池的场景,例如异步短信通知,异步发邮件,异步记录操作日志,异步处理批量Excel解析.这些异步处理的场景我们都可以把它放在线程池中去完成,当然还有很多场景也都可以使用线 ...
- python爬取今日的bing壁纸
#!/usr/bin/python #你要的文件夹是 E://pics// ps:没有的话帮你建一个 import requests import os from datetime import da ...
- 如何理解redis两种不同的持久化方式
其实redis就是一种高级的以键值对形式存储数据的数据库,而它的好处就是他可以支持数据的持久化,其实redis之所以会有这样的优点,主要是因为,redis的数据都是存放在内存中的,如果不配置持久化,那 ...