TypeScript 泛型程序设计指南

news/2024/12/21 22:28:14/

目录

文章目录

    • 目录
    • 一、泛型程序设计的概念
      • 示例:不使用泛型的函数
      • 使用泛型
    • 二、泛型的使用方式
      • 函数声明
      • 接口声明
      • 类声明
      • 约束泛型
      • 索引类型和约束类型
      • 多类型约束
    • 三、应用场景

一、泛型程序设计的概念

泛型程序设计是一种程序设计语言风格或范式,它允许开发者在强类型程序设计语言中编写代码时,使用一些未来才指定的类型。这些类型在实例化时作为参数指明,从而提高了代码的灵活性和可重用性。
在 TypeScript 中,泛型允许我们在定义函数、接口或类时,不预先定义具体的类型,而是在使用时指定类型。这种方式避免了代码的重复,并确保了类型安全。

示例:不使用泛型的函数

以下是一个不接受泛型的函数示例,它只能处理 number 类型的参数:

function returnItem(para: number): number {return para;
}

如果需要处理 string 类型,则需要重写函数:

function returnItem(para: string): string {return para;
}

这种方法导致代码重复,且不够灵活。

使用泛型

使用泛型可以解决这个问题:

function returnItem<T>(para: T): T {return para;
}

泛型使得开发者能够创建灵活且可重用的代码。

二、泛型的使用方式

泛型在 TypeScript 中通过 <> 语法使用,可以应用于函数、接口和类的声明。

函数声明

泛型函数的声明方式如下:

function returnItem<T>(para: T): T {return para;
}

可以定义多个类型参数,例如:

function swap<T, U>(tuple: [T, U]): [U, T] {return [tuple[1], tuple[0]];
}
swap([7, 'seven']); // 返回: ['seven', 7]

接口声明

泛型接口的声明方式如下:

interface ReturnItemFn<T> {(para: T): T
}

使用时指定类型:

const returnItem: ReturnItemFn<number> = para => para;

类声明

泛型类可以作用于类本身或类的成员函数:

class Stack<T> {private arr: T[] = [];public push(item: T) {this.arr.push(item);}public pop() {return this.arr.pop();}
}

使用方式:

const stack = new Stack<number>();

约束泛型

可以使用 <T extends xx> 来约束泛型:

class Demo<T extends object> {// 类实现
}

索引类型和约束类型

可以使用索引类型和约束类型来实现更复杂的泛型:

function getValue<T extends object, U extends keyof T>(obj: T, key: U) {return obj[key];
}

多类型约束

可以通过继承多个接口来实现多类型约束:

interface FirstInterface {doSomething(): number;
}
interface SecondInterface {doSomethingElse(): string;
}
interface ChildInterface extends FirstInterface, SecondInterface {}
class Demo<T extends ChildInterface> {private genericProperty: T;constructor(genericProperty: T) {this.genericProperty = genericProperty;}useT() {this.genericProperty.doSomething();this.genericProperty.doSomethingElse();}
}

三、应用场景

在 TypeScript 中,当需要定义函数、接口或类而不预先定义具体类型时,可以使用泛型。灵活地使用泛型定义类型是掌握 TypeScript 的关键。
通过上述介绍,我们可以看到泛型在提高代码复用性、灵活性和类型安全性方面的重要性。在编写 TypeScript 代码时,合理使用泛型将大大提升开发效率和代码质量。


http://www.ppmy.cn/news/1537232.html

相关文章

【Iceberg分析】Spark与Iceberg集成落地实践(一)

Spark与Iceberg集成落地实践&#xff08;一&#xff09; 文章目录 Spark与Iceberg集成落地实践&#xff08;一&#xff09;清理快照与元数据配置表维度自动清理元数据文件属性SPARK DDL语句作用 手动清理 清理孤岛文件合并数据文件可用配置rewriteDataFiles核心类图 清理快照与…

前端页面模块修改成可动态生成数据模块——大部分数据为GPT生成(仅供学习参考)

前端页面模块修改成可动态生成数据模块&#xff1a; 这些案例展示了如何通过Blade模板将前端页面模块变成可动态生成的模板。通过巧妙使用Blade语法、控制结构、CSS/JS分离、组件复用等技巧&#xff0c;可以大大提高代码的灵活性和复用性。在Laravel的Controller中准备好数据并…

Springboo通过http请求下载文件到服务器

这个方法将直接处理从URL下载数据并将其保存到文件的整个过程。下面是一个这样的方法示例&#xff1a; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.HttpURLConnection…

一篇文章入门MySQL数据库

目录 配置环境 下载 安装 登录 本地登录​ 远程登录 用户管理 用户增删查 查询用户 新增用户 删除用户 用户密码管理 重命名用户 用户权限管理 赋权 撤权 查看权限 数据类型 数值型 日期时间型 字符串型 show显示语句 查询数据库 查询数据表 其他用法…

Java之方法

方法&#xff08;函数&#xff09; Java中的方法必须定义在类或接口中。 package day2;import java.util.Scanner;public class way {public static void main(String[] args) {int arr[] new int[5];Scanner sc new Scanner(System.in);for (int i 0; i < arr.length;…

5个免费ppt模板网站推荐!轻松搞定职场ppt制作!

每次过完小长假&#xff0c;可以明显地感觉到&#xff0c;2024这一年很快又要结束了&#xff0c;不知此刻的你有何感想呢&#xff1f;是满载而归&#xff0c;还是准备着手制作年终总结ppt或年度汇报ppt呢&#xff1f; 每当说到制作ppt&#xff0c;很多人的第一反应&#xff0c…

大模型笔记05--coze经典案例分析

大模型笔记05--coze经典案例分析 介绍经典案例分析抖音视频转小红书文案艺术照 & 卡通照片助手艺术照图像流卡通照片图像流多功能图像助手 注意事项说明 介绍 扣子是新一代 AI 应用开发平台&#xff0c;具备完善的生态系统&#xff0c;是国内最出色的AI平台之一。用好coze…