function processArray<T extends string[] | number[]>(arr: T): T extends string[]? string : number {
if (Array.isArray(arr) && arr.length > 0) {
if (typeof arr[0] ==='string') {
return arr.join('') as T extends string[]? string : number;
} else {
return arr.reduce((acc, num) => acc + num, 0) as T extends string[]? string : number;
}
}
return '' as T extends string[]? string : number;
}
实现思路
- 定义泛型:使用
T
作为泛型,并约束T
为string[]
或者number[]
类型,这样函数参数arr
的类型就是T
。
- 条件类型:在函数返回值类型定义中使用条件类型
T extends string[]? string : number
,表示如果T
是string[]
类型,返回值就是string
类型,否则就是number
类型。
- 类型判断:在函数内部,通过判断数组第一个元素的类型(
typeof arr[0] ==='string'
),来决定是进行字符串拼接(arr.join('')
)还是数字求和(arr.reduce((acc, num) => acc + num, 0)
),最后使用类型断言将结果转换为合适的类型返回。如果数组为空,对于字符串数组返回空字符串,数字数组返回0。