TypeScript 多泛型参数
在TypeScript中,泛型(Generics)是一种强大的工具,它允许我们创建可重用的组件,这些组件可以处理多种类型的数据。当我们处理更复杂的场景时,可能需要使用多个泛型参数来增强代码的灵活性和可读性。本文将详细介绍如何在TypeScript中使用多个泛型参数,并通过实际案例展示其应用。
什么是多泛型参数?
多泛型参数是指在定义泛型函数、类或接口时,使用多个类型参数。这些类型参数可以是独立的,也可以相互依赖。通过使用多个泛型参数,我们可以更精确地描述函数或类的行为,使其能够处理多种类型的数据。
基本语法
在TypeScript中,我们可以通过在尖括号(<>
)中列出多个类型参数来定义多泛型参数。例如:
function identity<T, U>(value1: T, value2: U): [T, U] {
return [value1, value2];
}
在这个例子中,identity
函数接受两个泛型参数 T
和 U
,并返回一个包含这两个值的元组。
示例:多泛型参数的基本使用
让我们通过一个简单的例子来理解多泛型参数的使用:
function mergeObjects<T, U>(obj1: T, obj2: U): T & U {
return { ...obj1, ...obj2 };
}
const obj1 = { name: "Alice" };
const obj2 = { age: 25 };
const merged = mergeObjects(obj1, obj2);
console.log(merged); // 输出: { name: "Alice", age: 25 }
在这个例子中,mergeObjects
函数接受两个泛型参数 T
和 U
,并将两个对象合并为一个新的对象。通过使用多泛型参数,我们可以确保合并后的对象包含两个输入对象的所有属性。
多泛型参数的实际应用
案例1:处理键值对
假设我们有一个函数,它接受一个键值对,并返回一个新的键值对,其中键和值的类型可以不同。我们可以使用多泛型参数来实现这一点:
function swapKeyValue<T, U>(obj: Record<T, U>): Record<U, T> {
const swapped: Record<U, T> = {} as Record<U, T>;
for (const key in obj) {
swapped[obj[key]] = key;
}
return swapped;
}
const original = { a: 1, b: 2 };
const swapped = swapKeyValue(original);
console.log(swapped); // 输出: { 1: "a", 2: "b" }
在这个例子中,swapKeyValue
函数接受一个键值对对象,并返回一个新的对象,其中键和值的位置互换。通过使用多泛型参数,我们可以确保函数的输入和输出类型是灵活的。
案例2:处理异步操作
在处理异步操作时,我们可能需要处理多个不同类型的数据。例如,假设我们有一个函数,它接受一个异步操作和一个回调函数,并在操作完成后调用回调函数:
async function executeAsync<T, U>(asyncOperation: Promise<T>, callback: (result: T) => U): Promise<U> {
const result = await asyncOperation;
return callback(result);
}
const asyncOperation = Promise.resolve(42);
const callback = (result: number) => `The result is ${result}`;
executeAsync(asyncOperation, callback).then(console.log); // 输出: "The result is 42"