可以使用 TypeScript 的泛型和约束来实现这个通用函数。例如,我们通过定义一个接口来限定对象必须包含某些属性:
interface IUser {
name: string;
age: number;
}
function printNameAndAge(user: T): void {
console.log(`Name: ${user.name}, Age: ${user.age}`);
}
在上面的代码中,printNameAndAge 函数接收一个泛型参数 T,并使用 extends 约束该泛型必须是 IUser 接口的子类型,这样就可以确保对象包含 name 和 age 属性。
现在我们可以定义具有 name 和 age 属性的对象并将其传递给 printNameAndAge 函数:
const user = {
name: "Bob",
age: 30,
email: "bob@example.com"
};
printNameAndAge(user);
在上面的代码中,我们定义了一个名为 user 的对象,该对象包含 name、age 和 email 属性。虽然 email 属性不符合 IUser 接口的要求,但 TypeScript 编译器不会报错,因为我们只使用了 name 和 age 属性,并且这些属性是必需的。
当我们执行 printNameAndAge(user) 时,它将输出 Name: Bob, Age: 30,因为 user 对象包含这些属性。
注意,虽然 printNameAndAge 函数中使用了 void 关键字表示没有返回值,但实际上它返回的是 undefined。