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

泛型中<>和()中的类型

尖括号 < > 中的类型参数定义了一组可以被替换的类型占位符,而圆括号 (...) 内的类型使用则是这些类型参数的具体应用场景,展示了这些类型变量如何参与到函数的参数和返回值类型定义中去。这样设计既保证了代码的灵活性,又保持了类型安全,使得泛型函数能够在编译时进行类型检查,避免类型错误。

在泛型函数中,<> 中的类型参数用于定义函数内部的类型,并与函数参数的类型进行关联。下面是一个代码示例来说明这个关系:

function mergeArrays<T, U>(arr1: T[], arr2: U[]): (T | U)[] {return [...arr1, ...arr2];
}const numbers = [1, 2, 3];
const words = ["hello", "world"];const mergedArray = mergeArrays<number, string>(numbers, words);
console.log(mergedArray); // 输出: [1, 2, 3, "hello", "world"]

在这个示例中,mergeArrays 函数有两个类型参数 TU,分别表示 arr1arr2 的元素类型。然后,在调用函数时,我们通过 <number, string> 来具体指定了 TU 的类型。

这样做的好处是,我们可以在调用函数时显式地指定参数的类型,而不是依赖类型推断。这对于合并不同类型的数组非常有用,因为我们可以确保传递给函数的参数类型是我们期望的类型。如果不指定类型参数,TypeScript 会尝试根据传递的参数推断出类型,但有时候推断结果可能不是我们想要的。因此,通过明确指定类型参数,我们可以更精确地定义函数的行为。

在企业项目开发中,泛型函数因其灵活性和类型安全性而被广泛使用,以适应多种数据处理需求。以下是一些常用泛型函数的例子,这些函数在实际项目开发中能大大提高代码的复用性和维护性:

1. 泛型查找函数

function findItem<T>(array: T[], predicate: (item: T) => boolean): T | undefined {for (const item of array) {if (predicate(item)) {return item;}}return undefined;
}

这个函数可以在任意类型的数组中根据提供的谓词函数查找元素,提高了代码的通用性。

2. 泛型映射函数

function mapArray<T, U>(array: T[], mapper: (item: T) => U): U[] {return array.map(mapper);
}

此函数接收一个数组和一个转换函数,将数组中的每个元素转换为新类型后返回新数组,常用于数据预处理。

3. 泛型类型判断函数

function isInstanceOf<T>(object: any, classType: new (...args: any[]) => T): object is T {return object instanceof classType;
}

此函数用来检查一个对象是否属于某个类的实例,利用泛型确保类型安全性,常用于类型卫语句。

4. 泛型键值对合并

function mergeObjects<T extends object, U extends object>(obj1: T, obj2: U): T & U {return {...obj1, ...obj2};
}

这个函数可以合并两个对象的所有键值对,返回一个新的对象,其中包含两个输入对象的所有属性,适用于配置项合并等场景。

5. 泛型默认值函数

function withDefault<T>(value: T | null | undefined, defaultValue: T): T {return value !== null && value !== undefined ? value : defaultValue;
}

提供一个值和默认值,如果原值为空(null或undefined),则返回默认值,适用于处理可能缺失的数据。

这些泛型函数只是冰山一角,实际上泛型在复杂类型处理、库开发、API设计等多个方面都有广泛应用,能够帮助开发者编写更加健壮、灵活且易于维护的代码。

http://www.lryc.cn/news/374375.html

相关文章:

  • spark mllib 特征学习笔记 (一)
  • SQLite 日期 时间
  • 飞书API 2-1:如何通过 API 创建文件夹?
  • 【APP移动端自动化测试】第一节.环境配置和adb调试工具
  • Kotlin 协程:从基础概念到开发实践
  • IPNV6
  • C++并发之锁(std::lock_guard,std::unique_lock)
  • FreeRTOS队列(queue)
  • Azure数据分析Power BI
  • 将 Python3 程序打包成 APK 并运行在 ARM 的 Android 系统中
  • 学习记录:VS2019+OpenCV3.4.1实现SURF库函数的调用
  • JVM-基础知识
  • 保密工作应党而生、伴党而行、为党而兴
  • docker login 报错: http: server gave HTTP response to HTTPS client
  • 「C系列」C 文件读写
  • 编程中的cos:深度解析与应用探索
  • 计算机毕业设计hadoop+spark+hive知识图谱酒店推荐系统 酒店数据分析可视化大屏 酒店爬虫 高德地图API 酒店预测系统 大数据毕业设计
  • 简单谈谈云服务器私网IP的存在意义及优势
  • python错题(2)
  • 禁止methtype联网
  • 【iOS】UI学习——cell的复用及自定义cell
  • 【详细介绍下PostgreSQL】
  • 基于Matlab停车场车牌识别计时计费管理系统 【W2】
  • 码住!详解时序数据库不同分类与性能对比
  • 【C/C++】实参与形参的区别
  • ---异常---
  • python如何终止程序运行
  • 网络:用2个IP地址描述一个连接
  • Nodejs--构建web应用
  • C++ 二分查找法【面试】