面试题答案
一键面试function processArray<T>(arr: T[], callback: (element: T) => boolean): (string | Uppercase<string & T>)[] {
const allPass = arr.every(callback);
if (allPass) {
return arr.map((element) => (element as unknown as string).toUpperCase()) as (Uppercase<string & T>)[];
} else {
return arr.map((element) => element.toString()) as string[];
}
}
泛型和条件类型协同工作的分析
-
泛型
T
:函数processArray
定义了一个泛型T
,它代表数组arr
中元素的类型。这样函数就可以处理任意类型的数组。 -
条件类型:函数返回值类型为
(string | Uppercase<string & T>)[]
。这里的条件逻辑在于arr.every(callback)
的结果。- 如果
allPass
为true
,即所有元素通过callback
检查,那么返回值类型应该是原数组元素类型的大写形式。这里使用Uppercase<string & T>
,string & T
确保T
类型是可转换为字符串的(假设存在toUpperCase
方法),然后Uppercase
将其转换为大写形式。通过map
方法,将原数组每个元素转换为大写形式并返回,使用类型断言as (Uppercase<string & T>)[]
确保返回类型正确。 - 如果
allPass
为false
,即存在元素未通过callback
检查,返回值类型为string[]
。通过map
方法将原数组每个元素转换为字符串形式并返回,使用类型断言as string[]
确保返回类型正确。
整个过程中,泛型
T
提供了对不同数组元素类型的抽象,而条件类型根据callback
的检查结果来决定最终返回数组元素的具体类型,二者协同工作使得函数具有通用性和灵活性。 - 如果