返回

泛型函数也能重载?

前端

泛型函数,也叫泛型方法,是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

在上面的代码中,我们指定Tnumber类型,因此add函数将把两个数字相加,并返回一个数字。

泛型函数可以接受多个类型参数。例如,以下代码定义了一个泛型函数compare,该函数接受两个类型为TU的数据,并返回这两个数据的大小关系:

function compare<T, U>(a: T, b: U): number {
  if (a < b) {
    return -1;
  } else if (a > b) {
    return 1;
  } else {
    return 0;
  }
}

在上面的代码中,TU都是泛型类型参数,它们可以是任何类型。当我们调用compare函数时,需要指定泛型类型参数的具体类型。例如,以下代码调用compare函数,并传入两个数字作为参数:

const result = compare<number, number>(1, 2); // result: -1

在上面的代码中,我们指定Tnumber类型,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

在上面的代码中,我们指定Tnumber类型,因此max函数将返回两个数字中的最大值。

泛型函数是一种非常强大的工具,它可以帮助我们编写出更通用、更可重用的代码。泛型函数在TypeScript中非常常见,它可以帮助我们提高代码的质量和可维护性。