function transformArray<T, U>(arr: T[], ...transformers: ((arg: T) => U)[]): U[] {
return arr.map((element) => {
return transformers.reduce((acc, transformer) => {
return transformer(acc);
}, element);
});
}
实现过程解释
- 泛型定义:
T
代表输入数组 arr
中元素的类型。
U
代表经过所有转换函数处理后,最终数组元素的类型。
- 函数参数:
arr: T[]
明确输入参数 arr
是一个元素类型为 T
的数组。
...transformers: ((arg: T) => U)[]
表示接受多个转换函数,这些函数接受类型为 T
的参数并返回类型为 U
的值。这里利用了TypeScript的剩余参数语法和函数类型定义。
- 返回值类型:
U[]
表示返回一个元素类型为 U
的数组。
- 具体实现:
- 使用
map
方法遍历输入数组 arr
。对于每个元素,通过 reduce
方法依次调用传入的转换函数,将前一个函数的返回值作为下一个函数的参数,最终得到经过所有转换后的结果数组。
- 类型推断和泛型约束:
- 类型推断:TypeScript根据传入的数组类型和转换函数类型,自动推断出
T
和 U
的具体类型。例如,如果传入 number
数组和将 number
转换为 string
的函数,T
会被推断为 number
,U
会被推断为 string
,从而保证返回数组类型为 string[]
。
- 泛型约束:通过定义
transformers
的类型为 ((arg: T) => U)[]
,约束了所有转换函数必须接受 T
类型参数并返回 U
类型值,确保了转换逻辑的一致性和类型安全性,增强了代码的健壮性和复用性。