终于搞懂TS中的泛型啦! | typescript 入门指南 04

news2024/9/25 7:23:54

大家好,我是王天~

今天分享的是《ts入门指南》系列中第四篇,主要讲解ts中的泛型应用

泛型在ts中是比较重要的概念,我花挺长时间才搞明白,整理输出这篇文章,希望能帮助到大家 ~

《ts入门指南》系列,点击下方蓝色字体即可访问

  1.  Ts vs Js 谁适合前端开发? | TypeScript 入门指南 01
  2. 详解 tsconfig.json配置文件 | TypeScript 入门指南 02
  3. 必学!TypeScript语法类型基础 | TypeScript 入门指南 03

1. 前言

我们可以把泛型比喻为一个类型占位符,它告诉编译器:“嘿,这里有一个类型参数,我现在不确定具体是什么类型,但稍后会告诉你。”

通过使用泛型,我们可以编写更灵活、更可复用的代码。它允许我们在定义函数、类或接口时使用类型占位符来表示类型,而不直接指定具体的类型。这样,在实际使用时,我们可以传入不同的类型参数,使得代码可以适用于多种情况。

例如,让我们看一个简单的例子,来解释泛型的使用。假设我们有一个名为 identity 的函数,它接受一个参数并返回该参数:

function identity<T>(value: T): T {
  return value;
}

在上述代码中,<T> 表示这是一个泛型函数,T 是一个类型参数,可以是任何类型。函数的参数 arg 的类型为 T,返回值的类型也是 T

这样,我们可以在函数调用时传入不同的类型参数,使得函数适用于各种类型的参数。

例如,我们可以这样调用 identity 函数:

let result1 = identity<number>(42); // 传入 number 类型
let result2 = identity<string>("Hello, TypeScript"); // 传入 string 类型

在第一次调用时,类型参数 number 被传递给 identity 函数,所以返回值的类型也是 number。而在第二次调用时,类型参数 string 被传递给 identity 函数,所以返回值的类型是 string

通过使用泛型,我们可以编写出更加通用的函数,不限于特定的类型。这样一来,我们能够避免代码的重复编写,提高代码的可复用性和灵活性。

泛型主要用在四个场合:函数、接口、类和别名。

基本使用

泛型使用尖括号 <T> 来表示,并在定义函数、类或接口时指定类型参数。下面是一些基本的使用示例:

// 示例1: 创建一个泛型函数
function identity<T>(arg: T): T {
  return arg;
}

// 示例2: 使用泛型函数
let output = identity<string>("Hello");
console.log(output); // 输出: Hello

// 示例3: 使用类型推断,自动推断泛型类型
let output2 = identity("Hello");
console.log(output2); // 输出: Hello

在示例 1 中,函数 identity 使用了泛型类型参数 T,表示参数和返回值的类型可以是任何类型。示例 2 和示例 3 展示了如何使用泛型函数并指定参数的类型。。

2. 使用泛型变量:

泛型变量允许我们在函数或类中使用一种不确定的类型,而在实际使用时才确定具体的类型。

举个例子,考虑一个简单的函数identity,它接受一个参数并返回相同的值:

function identity<T>(arg: T): T {
  return arg;
}

在这个例子中,我们使用了泛型变量T,它可以代表任意类型。当我们调用函数identity时,编译器会根据传入的参数类型自动推断T的具体类型。

例如:

let result = identity<string>("Hello");
console.log(result); // 输出:Hello

let value = identity<number>(42);
console.log(value); // 输出:42

通过使用泛型变量,函数identity可以适用于不同类型的参数,提供了更高的灵活性和可重用性。

3. 泛型类型:

泛型类型允许我们创建可以适用于不同类型的变量、函数或类。

举个例子,考虑一个简单的数组反转函数reverse

function reverse<T>(array: T[]): T[] {
  return array.reverse();
}

在这个例子中,我们定义了一个泛型函数reverse,接受一个数组参数,并返回反转后的数组。泛型类型T用于指定数组的元素类型。

例如:

let numbers: number[] = [1, 2, 3, 4, 5];
let reversedNumbers = reverse(numbers);
console.log(reversedNumbers); // 输出:[5, 4, 3, 2, 1]

let strings: string[] = ["apple", "banana", "orange"];
let reversedStrings = reverse(strings);
console.log(reversedStrings); // 输出:["orange", "banana", "apple"]

通过使用泛型类型,函数reverse可以适用于不同类型的数组,提供了更高的灵活性和可重用性。

4. 泛型类:

泛型类允许我们创建可以适用于多种类型的类。类中的成员可以使用泛型类型进行声明和使用。

举个例子,考虑一个简单的Box类,用于存储任意类型的值:

class Box<T> {
  private value: T;

  constructor(value: T) {
    this.value = value;
  }

  getValue(): T {
    return this.value;
  }
}

在这个例子中,我们定义了一个泛型类Box,它具有一个私有成员value和一个公共方法getValue用于获取值。

例如:

let box1 = new Box<number>(42);
console.log(box1.getValue()); // 输出:42

let box2 = new Box<string>("Hello");
console.log(box2.getValue()); // 输出:Hello

过使用泛型参数<T>,可以在类的定义中引入类型变量来表示未知的类型。这样一来,我们可以在类实例化时指定具体的类型,从而创建适用于不同类型数据的类的实例。

5. 泛型约束:

泛型约束允许我们限制泛型类型的范围,使其满足特定条件

5.1. 确保属性存在

举个例子,假设我们想编写一个函数getLength,用于获取对象的长度。但是并不是所有的对象都有length属性,所以我们需要对泛型类型进行约束,确保它具有该属性。

例如:

interface HasLength {
  length: number;
}

function getLength<T extends HasLength>(obj: T): number {
  return obj.length;
}

在这个例子中,我们使用泛型约束T extends HasLength来限制泛型类型T必须满足HasLength接口的要求,即具有length属性。

例如:

let str = "Hello";
console.log(getLength(str)); // 输出:5

let arr = [1, 2, 3, 4, 5];
console.log(getLength(arr)); // 输出:5

通过使用泛型约束,函数getLength可以接受具有length属性的对象,并返回其长度。

5.2 检查对象的 key

1、keyof typescript 中检测类型的方法,以联合类型的方式方返回类型的所有 key 2、搭配泛型约、<T,K extends keyof T >

refshttps://juejin.cn/post/6844904184894980104#heading-0使用泛型,可以让我们在编译前发现错误。

6 泛型接口:

泛型接口允许我们定义可以适用于不同类型的接口。

举个例子,考虑一个简单的Transformer接口,它定义了一个将输入值转换为输出值的转换器:

interface Transformer<T, U> {
  transform(input: T): U;
}

在这个例子中,我们定义了一个泛型接口Transformer,它有两个类型参数TU,用于定义输入类型和输出类型。

例如,我们可以实现一个字符串到数字的转换器:

class StringToNumberTransformer implements Transformer<string, number> {
  transform(input: string): number {
    return parseFloat(input);
  }
}

通过定义实现了Transformer接口的类,我们可以创建不同类型的转换器。

例如:

let transformer = new StringToNumberTransformer();
let result = transformer.transform("3.14");
console.log(result); // 输出:3.14

通过使用泛型接口,我们可以定义可重用、可灵活的接口,适用于不同类型的转换操作。

接口搭配泛型,应用在 calss 类上

extend people 约束泛型类 在 people 接口范围内 此时是 泛型变量占位符,在实例化 class 类是传递类型

interface people {
  name: string;
  age: number;
}

class Popele<T extends people> {
  data: T;
  constructor(data: T) {
    this.data = data;
  }
  hi() {
    return `${this.data.name},,${this.data.age}`;
  }
}

let zhagnsan = new Popele<people>({ name: "张三", age: 18 });

总结

泛型在 TypeScript 中提供了更灵活、可重用的代码编写方式。它可以用于定义函数、类以及接口,让我们能够编写适用于不同类型的代码。


TypeScript 入门指南 (持续更新中🔥🔥🔥)

期待你的三连(点赞+收藏+关注)是我最大更新动力哦

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

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

相关文章

鸿蒙轻内核A核源码分析系列五 虚实映射(7)虚实映射Flag属性

往期知识点记录&#xff1a; 鸿蒙&#xff08;HarmonyOS&#xff09;应用层开发&#xff08;北向&#xff09;知识点汇总 轻内核A核源码分析系列一 数据结构-双向循环链表 轻内核A核源码分析系列二 数据结构-位图操作 轻内核A核源码分析系列三 物理内存&#xff08;1&#xff0…

如果 Android 手机出现数据丢失,如何在Android上恢复丢失的数据

当您的 Android 手机发生数据丢失时&#xff0c;您可能需要检索丢失的文件。为了帮助您完成此过程&#xff0c;以下是执行 Android 数据恢复的一些有效方法&#xff1a; 如何在Android上检索数据 如果您的 Android 手机出现数据丢失&#xff0c;您可能需要检索丢失的文件。为了…

Python批量发邮件:如何批量发个性化邮件?

Python批量发邮件的实用技巧&#xff1f;如何利用Python发邮件&#xff1f; 无论是营销推广、客户关怀&#xff0c;还是内部通知&#xff0c;个性化邮件都能显著提升沟通效果。那么&#xff0c;Python批量发邮件如何实现个性化呢&#xff1f;本文将详细介绍如何使用Python批量…

ESP32 UDP 05

1.在上一文章基础上修改&#xff0c;文章网址 ESP32-Ethernet-04-CSDN博客 2.基本代码 /* Ethernet Basic ExampleThis example code is in the Public Domain (or CC0 licensed, at your option.)Unless required by applicable law or agreed to in writing, thissoftware…

再见Java 8,请掌握最新LTS

简介 在Java开发中&#xff0c;Java 8曾经是无可争议的主流&#xff0c;凭借其稳定性和广泛的社区支持&#xff0c;陪伴了无数开发者走过多年辉煌时刻。然而&#xff0c;随着时间的推移&#xff0c;技术不断革新&#xff0c;企业和开发者们逐渐把目光投向了更新的LTS&#xff0…

LLM时代的transformer参数量、计算量、激活值的分析

导读&#xff1a;本文可以看作是对分析transformer模型的参数量、计算量、中间激活、KV cache的详细说明 定性分析 GPU上都存了哪些东西 首先我们来从全局整体的角度看一看&#xff0c;在训练阶段GPU显存上都有哪些内容&#xff1a; Model States&#xff1a;模型训练过程中…

使用 nuxi upgrade 升级现有nuxt项目版本

title: 使用 nuxi upgrade 升级现有nuxt项目版本 date: 2024/9/10 updated: 2024/9/10 author: cmdragon excerpt: 摘要:本文介绍了如何使用nuxi upgrade命令升级Nuxt 3项目,包括打开终端、运行升级命令、使用选项、测试项目等步骤,以及升级前的注意事项,如备份代码、检…

shader 案例学习笔记之绘制圆

环境搭建&#xff1a;参考glsl vscode环境搭建 先上代码 #ifdef GL_ES precision mediump float; #endifuniform vec2 u_resolution;void main(){vec2 st gl_FragCoord.xy/u_resolution.xy;st - 0.5;st.x * u_resolution.x/u_resolution.y;float r length(st);float d ste…

【面试分享】面试题——网络题目_网络面试题

&#x1f91f; 基于入门网络安全/黑客打造的&#xff1a;&#x1f449;黑客&网络安全入门&进阶学习资源包 一、题目 1、网关、网桥、路由器、中继器作用、实现以及对应的osi层? 2、MAC地址是什么? 3、webSocket是什么? 4、常见的协议有哪些&#xff1f; 5、什么…

交换机vlan配置实现

交换机配置 1. 配置交换机速度 进入交换机相应端口。 speed数值&#xff1a; 单位为Mbits;可选10&#xff0c;100&#xff0c;auto duplex参数&#xff1a;参数可选full全双工,half半双工,auto自适应 配置交换机管理IP地址&#xff1a; 在全局模式下&#xff1a; interf…

Qt使用UDP进行单波通信

Qt使用UDP进行单波通信 我们一般学习完基础的一些编程之后就会开始接触网络编程&#xff0c;我们熟悉的网络编程一般会涉及到两个协议一个时TCP&#xff0c;一个是UDP。TCP一般是point to point&#xff0c;UDP一般有单播和广播两种方式&#xff0c;那么我们今天就来学习一下单…

ECRS软件作业分析:提升工厂生产效率的钥匙

在竞争日益激烈的现代工业环境中&#xff0c;如何提升生产效率、降低资源消耗、增加产品价值&#xff0c;成为了每一家制造企业必须面对的重要课题。作业分析&#xff0c;作为一种科学的管理工具&#xff0c;正逐步成为企业优化生产流程、提升竞争力的关键手段。本文旨在深入探…

Unity SRP 可编程渲染管线的基本用法

可编程渲染管线使用教程 SRP 可以处理Canvas为Screen Space - Overlay的渲染 安装插件 首先进入package manager&#xff0c;下载Core RP Lib组件 创建渲染管线 编写渲染管线逻辑脚本 新建脚本取名为MPipeLine&#xff0c;该脚本用于实现渲染管线的处理逻辑 using Unity…

Python计算机视觉 第7章-图像搜索

Python计算机视觉 第7章-图像搜索 7.1 基于内容的图像检索 在大型图像数据库上&#xff0c;CBIR&#xff08;Content-Based Image Retrieval&#xff0c;基于内容的图像检索&#xff09;技术用于检索在视觉上具相似性的图像。这样返回的图像可以是颜色相似、纹理相似、图像中…

优秀一点点

在职场中&#xff0c;想要获得晋升&#xff0c;重要的是比其他同事优秀一点点。这就好比百米短跑比赛&#xff0c;第一名比第二名可能之快了0.01秒&#xff0c;这个0.01秒&#xff0c;和跑一百米所花的10秒钟比起来&#xff0c;可能只有千分之一。也就是说&#xff0c;第一名比…

麦汁煮沸工艺

麦汁煮沸是啤酒酿造中至关重要的工艺环节之一&#xff0c;直接影响啤酒的风味。今天&#xff0c;天泰邀您一起深入探讨这一关键的酿造技术。 煮沸麦汁 在煮沸麦汁时&#xff0c;时间和温度控制至关重要。通常&#xff0c;麦汁煮沸持续 40 到 50 分钟&#xff0c;具体时间取决于…

OpenAI Embeddings API: How embeddings work?

题意&#xff1a;OpenAI 嵌入 API&#xff1a;嵌入是如何工作的&#xff1f; 问题背景&#xff1a; There are quite a few tutorials on embeddings in OpenAI. I cant understand how they work. 在OpenAI中有很多关于嵌入的教程&#xff0c;但我无法理解它们是如何工作的。…

轻松实现游戏串流,内网穿透

一、部署Gemini Gemini使用教程 二、部署Moonlight 过程大概说一下&#xff0c;网上有太多太多moonlight的东西了 需要运行游戏的机器上安装GFE&#xff08;GeForce Experience&#xff09;&#xff0c;登录并开启GAMESTREAM&#xff08;游戏串流&#xff09;功能 注&…

什么是 Flash Attention

Flash Attention 是 由 Tri Dao 和 Dan Fu 等人在2022年的论文 FlashAttention: Fast and Memory-Efficient Exact Attention with IO-Awareness 中 提出的&#xff0c; 论文可以从 https://arxiv.org/abs/2205.14135 页面下载&#xff0c;点击 View PDF 就可以下载。 下面我…

Php数组函数中的那些什么sort排序函数是不是很乱? 可以这样看。以及php搜索给定的值在数组中最后一次出现的位置的实现思考

一、Php数组函数中的那些什么sort排序函数是不是很乱? 可以这样看 PHP的数组函数真不少&#xff0c;甚至对一个程序员来说&#xff0c;在其整个程序生涯中有些方法他永远也不会用上。不过每一个方法都有其价值、或者在出现的时候有其价值。所以偶尔有空时还是可以去看看。在这…