MST

星途 面试题库

面试题:TypeScript对象类型与接口在泛型编程中的深度应用

编写一个TypeScript泛型函数,该函数接受一个对象数组,对象的结构通过接口定义,并且接口需要具备可扩展性,以便在不同场景下可以添加额外字段。泛型函数要实现根据某个特定字段对数组进行排序,并且能够处理不同类型的排序字段(如字符串、数字)。请详细说明设计思路,并提供完整代码实现。
22.3万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试

设计思路

  1. 定义可扩展接口:使用 interface 定义对象结构,为了实现可扩展性,可以在接口中使用索引签名 [key: string]: any,这样在不同场景下可以添加额外字段。
  2. 编写泛型函数:函数接受一个对象数组和用于排序的字段名作为参数。通过 T 泛型来表示对象的类型,使得函数可以处理不同结构的对象数组。
  3. 处理不同类型排序字段:在函数内部,根据字段值的类型(字符串或数字)进行不同方式的排序。对于字符串,使用 localeCompare 方法;对于数字,直接比较大小。

代码实现

interface ExtensibleObject {
    [key: string]: any;
}

function sortByField<T extends ExtensibleObject>(array: T[], field: keyof T): T[] {
    return array.sort((a, b) => {
        const valueA = a[field];
        const valueB = b[field];

        if (typeof valueA ==='string' && typeof valueB ==='string') {
            return valueA.localeCompare(valueB);
        } else if (typeof valueA === 'number' && typeof valueB === 'number') {
            return valueA - valueB;
        } else {
            return 0;
        }
    });
}

// 示例用法
interface User {
    name: string;
    age: number;
}

const users: User[] = [
    { name: 'Alice', age: 25 },
    { name: 'Bob', age: 20 },
    { name: 'Charlie', age: 30 }
];

const sortedByName = sortByField(users, 'name');
const sortedByAge = sortByField(users, 'age');

console.log(sortedByName);
console.log(sortedByAge);