当前位置: 首页 > news >正文

泛型约束:用于限制泛型类型参数的范围

🤍 前端开发工程师、技术日更博主、已过CET6
🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1
🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》、《前端求职突破计划》
🍚 蓝桥云课签约作者、上架课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入门到实战全面掌握 uni-app》

泛型约束(Generic Constraints)用于限制泛型类型参数的范围,以确保它们满足特定的条件。通过泛型约束,可以在编译时捕获更多的类型错误,提高代码的安全性和可维护性。

在这里插入图片描述

泛型约束的基本概念

泛型约束通过在类型参数后面添加 extends 关键字来实现。可以约束类型参数必须实现某个接口、继承某个类或满足某个条件。

示例

约束为特定接口
interface HasLength {
length: number;
}function getLength<T extends HasLength>(arg: T): number {
return arg.length;
}let result = getLength("Hello, world!"); // 输出: 13

在这个例子中,getLength 函数的类型参数 T 被约束为必须实现 HasLength 接口,因此可以安全地访问 length 属性。

约束为特定类
class Animal {
constructor(public name: string) {}
}class Dog extends Animal {
bark() {
console.log(`${this.name} is barking.`);
}
}function makeAnimalSpeak<T extends Animal>(animal: T): void {
console.log(`${animal.name} makes a sound.`);
}let dog = new Dog("Buddy");
makeAnimalSpeak(dog); // 输出: Buddy makes a sound.

在这个例子中,makeAnimalSpeak 函数的类型参数 T 被约束为必须继承自 Animal 类,因此可以安全地访问 name 属性。

使用多个约束
interface HasName {
name: string;
}interface HasAge {
age: number;
}function printPersonInfo<T extends HasName & HasAge>(person: T): void {
console.log(`Name: ${person.name}, Age: ${person.age}`);
}let person = { name: "Alice", age: 30 };
printPersonInfo(person); // 输出: Name: Alice, Age: 30

在这个例子中,printPersonInfo 函数的类型参数 T 被约束为必须同时实现 HasNameHasAge 接口。

泛型约束的优势

  1. 类型安全:通过泛型约束,可以在编译时捕获更多的类型错误,确保代码的安全性。
  2. 代码可读性:泛型约束使代码更加清晰,明确类型参数的要求。
  3. 灵活性:泛型约束提供了更高的灵活性,可以在不同的上下文中使用相同的泛型函数或类。

通过合理使用泛型约束,可以编写出更加安全、可维护且灵活的代码。

http://www.xdnf.cn/news/931465.html

相关文章:

  • 力扣HOT100之二分查找:4. 寻找两个正序数组的中位数
  • 深入解析 Pandas 核心数据结构:Series 与 DataFrame
  • ubuntu 安装 sougou
  • c++ 头文件
  • iview组件库:当后台返回到的数据与使用官网组件指定的字段不匹配时,进行修改某个属性名再将response数据渲染到页面上的处理
  • 海思Hi3798MV310_V39_HMS DDR3_安卓9.0_外贸盒update升级包
  • ALOHA ACT算法与源码笔记
  • Keil进阶操作
  • 前沿探索:可视化助力设备运维实现跨越式发展
  • JAVA反序列化应用 : URLDNS案例
  • 前端获取接口数据流程
  • 二分答案-P1873 砍树
  • MySQL中的部分问题(2)
  • Spring整合Mybatis
  • WEB3全栈开发——面试专业技能点P3JavaScript / TypeScript
  • 数据库、数据仓库、数据中台、数据湖相关概念
  • MATLAB R2025a|Win中文|仿真建模|安装教程
  • uni-app学习笔记二十三--交互反馈showToast用法
  • Docker 安装 Ubuntu
  • day27-shell编程(自动化)
  • 附加模块--Qt Shader Tools功能及架构解析
  • typeof运算符 +unll和undefined的区别
  • AI书签管理工具开发全记录(十七):Sun-Panel书签同步实现
  • 【ArcGIS Pro微课1000例】0072:如何自动保存编辑内容及保存工程?
  • 68常用控件_QGroupBox的使用
  • C语言中的文件操作
  • Android写一个捕获全局异常的工具类
  • 【hive】函数集锦:窗口函数、列转行、日期函数
  • stm32-c8t6实现语音识别(LD3320)
  • 【Mac 从 0 到 1 保姆级配置教程 16】- Docker 快速安装配置、常用命令以及实际项目演示