面试题答案
一键面试遇到的场景
在使用一个函数,该函数接收一个泛型数组,数组中的元素是一个对象,对象包含多个不同类型的属性,同时函数返回值是根据数组元素对象的某个属性值筛选后的新数组。例如:
function filterByProperty<T>(arr: T[], property: keyof T, value: T[keyof T]): T[] {
return arr.filter(item => item[property] === value);
}
假设有如下数据结构:
interface User {
id: number;
name: string;
age: number;
}
const users: User[] = [
{ id: 1, name: 'Alice', age: 25 },
{ id: 2, name: 'Bob', age: 30 }
];
当调用 filterByProperty(users, 'age', 25)
时,类型推断就可能出现问题。
类型推断失败原因
keyof T
是一个泛型类型,它可以表示T
类型中任意属性的键。在实际调用时,TypeScript 很难从'age'
这个具体字符串推断出T
的准确类型,因为T
可以是任何包含age
属性的类型。T[keyof T]
表示T
类型中任意属性的值类型,同样由于泛型的不确定性,TypeScript 难以确定25
与T[keyof T]
的准确匹配关系。
手动指定类型解决问题
可以通过手动指定泛型类型来解决这个问题:
filterByProperty<User>(users, 'age', 25);
这样明确指定 T
为 User
类型,就使得 keyof T
明确为 'id' | 'name' | 'age'
,T[keyof T]
也能准确匹配到 number
或 string
,从而让函数调用的类型更加明确,避免类型推断失败的问题。