面试题答案
一键面试// 定义通用函数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);
代码解释
-
通用函数
identity
:function identity<T>(arg: T): T
,这里的<T>
是类型参数,arg
的类型是T
,返回值类型也是T
,这就确保了无论传入什么类型的参数,都返回相同类型的参数。
-
定义对象类型和数组:
- 定义了
Person
和Animal
接口,它们都有name
属性,结构相似。 - 创建了
people
和animals
数组,分别存储Person
和Animal
类型的对象。
- 定义了
-
操作对象数组的函数
printName
:function printName<T extends { name: string }>(arr: T[])
,这里的T
被约束为至少包含name
属性的类型。- 在
forEach
循环中,使用identity
函数获取对象,然后打印name
属性。由于identity
函数的泛型,这里不需要显式指定返回值类型,利用了类型推断,避免了重复类型信息。
-
调用函数:
- 分别调用
printName
函数并传入people
和animals
数组,实现对不同类型但结构相似的对象数组的操作,且没有重复编写关于对象类型的信息。
- 分别调用