1. 排序算法实现
// 泛型排序函数,使用冒泡排序示例
function sort<T extends number | string>(arr: T[]): T[] {
const newArr = [...arr];
for (let i = 0; i < newArr.length - 1; i++) {
for (let j = 0; j < newArr.length - 1 - i; j++) {
if ((newArr[j] as number) > (newArr[j + 1] as number)) {
[newArr[j], newArr[j + 1]] = [newArr[j + 1], newArr[j]];
}
}
}
return newArr;
}
2. 查找算法实现
// 泛型查找函数,使用线性查找示例
function find<T>(arr: T[], target: T): number {
for (let i = 0; i < arr.length; i++) {
if (arr[i] === target) {
return i;
}
}
return -1;
}
3. 数据过滤算法实现
// 泛型数据过滤函数
function filter<T>(arr: T[], callback: (item: T) => boolean): T[] {
const result: T[] = [];
for (let i = 0; i < arr.length; i++) {
if (callback(arr[i])) {
result.push(arr[i]);
}
}
return result;
}
4. 泛型在算法组合与交互中的作用
- 保证数据类型一致性:通过泛型
T
,在不同算法(排序、查找、过滤)中,输入和输出的数据类型保持一致。例如,sort
函数接收 T[]
类型数组,返回 T[]
类型数组;find
函数接收 T[]
类型数组和 T
类型目标值,返回 number
类型索引。这确保了在整个工具库中,数据类型的正确性,避免类型错误。
- 系统扩展性:泛型使得算法可以应用于多种数据类型,而不需要为每种数据类型单独编写算法。例如,
sort
函数可以对 number[]
或 string[]
进行排序,若未来有新的数据类型需要排序,只要该类型支持比较操作,即可直接使用 sort
函数,无需修改函数代码。
5. 处理类型依赖和转换问题
- 类型依赖:在算法交互时,某些算法可能依赖于其他算法的输出类型。例如,先使用
filter
过滤数据,再对过滤后的数据使用 sort
排序。由于泛型 T
的一致性,保证了 filter
输出的数组类型与 sort
输入的数组类型相同,从而避免类型不匹配问题。
- 类型转换:在实际应用中,可能需要对数据进行类型转换。例如在
sort
函数中,当 T
为 number
类型时,可以直接比较大小;但如果 T
为自定义类型,可能需要定义比较函数。可以通过在泛型中添加约束,如 T extends { compareTo: (other: T) => number }
,来确保类型具有比较方法,从而实现类型安全的转换和操作。同时,在不同算法间传递数据时,要确保数据类型的兼容性,避免因类型转换错误导致运行时错误。