面试题答案
一键面试function filterAndLimit<T>(arr: T[], func: (item: T) => boolean = () => true, limit: number = 5): T[] {
return arr.filter(func).slice(0, limit);
}
可选参数、默认参数与泛型的配合
- 可选参数:函数中的第二个参数
func
是可选参数。这意味着调用函数时可以不传递这个参数。当不传递时,会使用默认值() => true
。 - 默认参数:第二个参数
func
和第三个参数limit
都有默认值。默认参数使得在调用函数时如果没有提供对应参数,函数仍能正常运行并使用默认值。例如,调用filterAndLimit([1, 2, 3])
时,func
使用() => true
,limit
使用5
。 - 泛型:
T
是泛型,它允许函数处理不同类型的数组。无论数组元素是number
、string
还是自定义类型,函数都能通过T
进行类型推断和处理。
类型推断相关问题及解决
- 函数参数类型推断:如果没有显式传递
func
参数,由于使用了默认值() => true
,TypeScript 可以推断出func
接受任何类型的参数(因为默认函数不依赖参数)。如果传递了自定义函数,TypeScript 会根据函数定义推断func
接受T
类型的参数。 - 返回值类型推断:TypeScript 会根据数组
arr
的类型推断返回值类型为T[]
。例如,如果arr
是number[]
,则返回值也是number[]
。
在复杂场景下,可能会遇到的问题是当 func
的类型与 T
的实际类型不匹配时。例如,如果传递了一个期望 string
类型参数的函数给 filterAndLimit
,但 T
推断为 number
,就会报错。解决方法是确保传递给 func
的函数参数类型与 T
的实际类型匹配,或者在调用函数时显式指定泛型类型,如 filterAndLimit<number>([1, 2, 3], (num) => num > 1)
。