MST

星途 面试题库

面试题:TypeScript类型推断之高级题

在复杂的泛型类型定义中,类型推断有时会遇到困难。请描述一个你遇到过的这种场景,说明为什么类型推断失败,并阐述如何手动指定类型以解决问题。
18.2万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试

遇到的场景

在使用一个函数,该函数接收一个泛型数组,数组中的元素是一个对象,对象包含多个不同类型的属性,同时函数返回值是根据数组元素对象的某个属性值筛选后的新数组。例如:

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) 时,类型推断就可能出现问题。

类型推断失败原因

  1. keyof T 是一个泛型类型,它可以表示 T 类型中任意属性的键。在实际调用时,TypeScript 很难从 'age' 这个具体字符串推断出 T 的准确类型,因为 T 可以是任何包含 age 属性的类型。
  2. T[keyof T] 表示 T 类型中任意属性的值类型,同样由于泛型的不确定性,TypeScript 难以确定 25T[keyof T] 的准确匹配关系。

手动指定类型解决问题

可以通过手动指定泛型类型来解决这个问题:

filterByProperty<User>(users, 'age', 25);

这样明确指定 TUser 类型,就使得 keyof T 明确为 'id' | 'name' | 'age'T[keyof T] 也能准确匹配到 numberstring,从而让函数调用的类型更加明确,避免类型推断失败的问题。