MST

星途 面试题库

面试题:TypeScript高级函数类型与泛型

编写一个TypeScript函数,该函数接受一个函数数组(数组中的函数类型需用泛型来表示,每个函数接受不同数量和类型的参数并返回不同类型的值),然后依次调用数组中的函数,并将每个函数的返回值收集到一个数组中返回。请详细说明函数类型定义、泛型的使用及类型推断过程。
29.4万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试
// 定义一个函数类型,该类型接受任意数量和类型的参数并返回任意类型的值
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 参数是一个函数数组。

类型推断过程

  1. 当我们调用 callFunctions 并传入一个函数数组时,TypeScript 会根据传入的具体函数类型来推断泛型 T 的实际类型。
  2. callFunctions 函数内部,ReturnType<T[K]> 用于获取 T 数组中每个函数的返回值类型。KT 的索引类型,通过 keyof T 获取。
  3. 最后,我们将收集到的返回值数组 results 进行类型断言,将其转换为 { [K in keyof T]: ReturnType<T[K]> } 类型,以确保返回值数组的类型与每个函数的返回值类型相对应。