泛型函数也能重载?
2023-09-24 10:14:45
泛型函数,也叫泛型方法,是TypeScript中的一种函数,可以在函数声明中使用类型参数,从而实现代码复用。泛型函数可以接受任何类型的数据,并在函数内部根据传入的数据类型进行处理,从而实现代码的通用性。
泛型函数的定义与普通函数相似,只是在函数声明中添加了类型参数。类型参数使用尖括号 <> 包裹,放在函数名的后面。例如,以下代码定义了一个泛型函数add
,该函数接受两个类型为T
的数据,并返回这两个数据之和:
function add<T>(a: T, b: T): T {
return a + b;
}
在上面的代码中,T
是泛型类型参数,它可以是任何类型。当我们调用add
函数时,需要指定泛型类型参数的具体类型。例如,以下代码调用add
函数,并传入两个数字作为参数:
const result = add<number>(1, 2); // result: 3
在上面的代码中,我们指定T
为number
类型,因此add
函数将把两个数字相加,并返回一个数字。
泛型函数可以接受多个类型参数。例如,以下代码定义了一个泛型函数compare
,该函数接受两个类型为T
和U
的数据,并返回这两个数据的大小关系:
function compare<T, U>(a: T, b: U): number {
if (a < b) {
return -1;
} else if (a > b) {
return 1;
} else {
return 0;
}
}
在上面的代码中,T
和U
都是泛型类型参数,它们可以是任何类型。当我们调用compare
函数时,需要指定泛型类型参数的具体类型。例如,以下代码调用compare
函数,并传入两个数字作为参数:
const result = compare<number, number>(1, 2); // result: -1
在上面的代码中,我们指定T
为number
类型,U
也为number
类型,因此compare
函数将比较两个数字的大小关系,并返回一个数字。
泛型函数还可以重载。重载是指同一个函数名可以对应多个不同的函数实现。泛型函数的重载与普通函数的重载类似,只是在函数声明中添加了类型参数。例如,以下代码定义了一个重载的泛型函数max
,该函数可以接受两个数字或两个字符串作为参数,并返回这两个数据中的最大值:
function max<T extends number | string>(a: T, b: T): T {
if (typeof a === 'number' && typeof b === 'number') {
return Math.max(a, b);
} else if (typeof a === 'string' && typeof b === 'string') {
return a > b ? a : b;
} else {
throw new Error('Invalid arguments');
}
}
在上面的代码中,T
是一个泛型类型参数,它可以是number
类型或string
类型。当我们调用max
函数时,需要指定泛型类型参数的具体类型。例如,以下代码调用max
函数,并传入两个数字作为参数:
const result = max<number>(1, 2); // result: 2
在上面的代码中,我们指定T
为number
类型,因此max
函数将返回两个数字中的最大值。
泛型函数是一种非常强大的工具,它可以帮助我们编写出更通用、更可重用的代码。泛型函数在TypeScript中非常常见,它可以帮助我们提高代码的质量和可维护性。