面试题答案
一键面试// 定义一个函数类型,该类型接受任意数量和类型的参数并返回任意类型的值
type AnyFunction = (...args: any[]) => any;
// 定义主函数,接受一个函数数组作为参数,并返回一个包含所有函数返回值的数组
function callFunctions<T extends AnyFunction[]>(functions: T): { [K in keyof T]: ReturnType<T[K]> } {
// 初始化一个空数组用于存储返回值
const results: any[] = [];
// 遍历函数数组,依次调用每个函数并收集返回值
functions.forEach((func) => {
results.push(func());
});
return results as { [K in keyof T]: ReturnType<T[K]> };
}
// 示例函数
function add(a: number, b: number): number {
return a + b;
}
function greet(name: string): string {
return `Hello, ${name}!`;
}
// 调用主函数
const results = callFunctions([add, greet]);
console.log(results); // 输出: [number, string]
函数类型定义
我们定义了一个 AnyFunction
类型,它表示接受任意数量和类型的参数并返回任意类型值的函数。这是为了能够处理传入的不同类型的函数。
泛型的使用
在 callFunctions
函数定义中,我们使用了泛型 T
,它被约束为 AnyFunction[]
,表示一个函数数组类型。这样可以确保传入的 functions
参数是一个函数数组。
类型推断过程
- 当我们调用
callFunctions
并传入一个函数数组时,TypeScript 会根据传入的具体函数类型来推断泛型T
的实际类型。 - 在
callFunctions
函数内部,ReturnType<T[K]>
用于获取T
数组中每个函数的返回值类型。K
是T
的索引类型,通过keyof T
获取。 - 最后,我们将收集到的返回值数组
results
进行类型断言,将其转换为{ [K in keyof T]: ReturnType<T[K]> }
类型,以确保返回值数组的类型与每个函数的返回值类型相对应。