MST

星途 面试题库

面试题:TypeScript中使用泛型避免重复类型信息

设计一个TypeScript的通用函数`identity`,它接受一个参数并返回这个参数,要求这个函数能适用于任何类型的参数,同时在调用这个函数时,使用类型推断而不是显式指定类型参数,来避免重复类型信息。另外,设计一个场景,在这个场景中有多个不同类型但结构相似的对象数组,使用`identity`函数结合泛型类型约束,对每个数组中的对象进行操作(例如打印对象中的某个属性),并说明这样做是如何避免重复类型信息的,写出详细代码及解释。
14.2万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试
// 定义通用函数identity
function identity<T>(arg: T): T {
    return arg;
}

// 定义不同类型但结构相似的对象
interface Person {
    name: string;
    age: number;
}

interface Animal {
    name: string;
    legs: number;
}

// 创建不同类型的对象数组
const people: Person[] = [
    { name: 'Alice', age: 30 },
    { name: 'Bob', age: 25 }
];

const animals: Animal[] = [
    { name: 'Dog', legs: 4 },
    { name: 'Cat', legs: 4 }
];

// 使用identity函数结合泛型类型约束操作对象数组
function printName<T extends { name: string }>(arr: T[]) {
    arr.forEach((item) => {
        const result = identity(item);
        console.log(result.name);
    });
}

// 调用函数操作不同类型的对象数组
printName(people);
printName(animals);

代码解释

  1. 通用函数identity

    • function identity<T>(arg: T): T,这里的<T>是类型参数,arg的类型是T,返回值类型也是T,这就确保了无论传入什么类型的参数,都返回相同类型的参数。
  2. 定义对象类型和数组

    • 定义了PersonAnimal接口,它们都有name属性,结构相似。
    • 创建了peopleanimals数组,分别存储PersonAnimal类型的对象。
  3. 操作对象数组的函数printName

    • function printName<T extends { name: string }>(arr: T[]),这里的T被约束为至少包含name属性的类型。
    • forEach循环中,使用identity函数获取对象,然后打印name属性。由于identity函数的泛型,这里不需要显式指定返回值类型,利用了类型推断,避免了重复类型信息。
  4. 调用函数

    • 分别调用printName函数并传入peopleanimals数组,实现对不同类型但结构相似的对象数组的操作,且没有重复编写关于对象类型的信息。