MST
星途 面试题库

面试题:TypeScript可选和默认参数在泛型函数及复杂类型场景下的深度应用

编写一个泛型TypeScript函数,该函数接收三个参数:第一个参数是一个数组(类型为泛型T[]),第二个参数是一个可选的函数,该函数接收类型T的参数并返回布尔值,默认值为一个总是返回true的函数,第三个参数是一个默认值为5的数字。函数的功能是从数组中筛选出满足第二个参数函数条件的元素,并且只返回前第三个参数指定数量的元素。请详细说明在这个复杂场景下,可选参数、默认参数以及泛型是如何相互配合,以及可能会遇到哪些类型推断相关的问题及如何解决。
48.6万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试
function filterAndLimit<T>(arr: T[], func: (item: T) => boolean = () => true, limit: number = 5): T[] {
    return arr.filter(func).slice(0, limit);
}

可选参数、默认参数与泛型的配合

  1. 可选参数:函数中的第二个参数 func 是可选参数。这意味着调用函数时可以不传递这个参数。当不传递时,会使用默认值 () => true
  2. 默认参数:第二个参数 func 和第三个参数 limit 都有默认值。默认参数使得在调用函数时如果没有提供对应参数,函数仍能正常运行并使用默认值。例如,调用 filterAndLimit([1, 2, 3]) 时,func 使用 () => truelimit 使用 5
  3. 泛型T 是泛型,它允许函数处理不同类型的数组。无论数组元素是 numberstring 还是自定义类型,函数都能通过 T 进行类型推断和处理。

类型推断相关问题及解决

  1. 函数参数类型推断:如果没有显式传递 func 参数,由于使用了默认值 () => true,TypeScript 可以推断出 func 接受任何类型的参数(因为默认函数不依赖参数)。如果传递了自定义函数,TypeScript 会根据函数定义推断 func 接受 T 类型的参数。
  2. 返回值类型推断:TypeScript 会根据数组 arr 的类型推断返回值类型为 T[]。例如,如果 arrnumber[],则返回值也是 number[]

在复杂场景下,可能会遇到的问题是当 func 的类型与 T 的实际类型不匹配时。例如,如果传递了一个期望 string 类型参数的函数给 filterAndLimit,但 T 推断为 number,就会报错。解决方法是确保传递给 func 的函数参数类型与 T 的实际类型匹配,或者在调用函数时显式指定泛型类型,如 filterAndLimit<number>([1, 2, 3], (num) => num > 1)