Skip to content

泛型函数

泛型的使用,一般有泛型函数,泛型类,泛型接口。本文中主要介绍泛型函数。 泛型函数是一种能够适用于多种类型的函数,通过在函数签名中使用类型参数来实现。它可以增加代码的灵活性和可重用性,同时在编译时提供类型安全性。 下面是一个详细描述泛型函数的示例:

ts
function identity<T>(arg: T): T {
  return arg;
}

在这个示例中,identity函数是一个泛型函数。它接受一个类型为T的参数arg,并返回一个相同类型T的值。这个函数是一个身份函数,即它接受什么类型的参数,就返回什么类型的值。
我们可以在调用泛型函数时进行类型推断,也可以显式指定类型参数。下面是一些示例:

ts
let result1 = identity(10);  // 类型推断,result1的类型为number
let result2 = identity<string>("hello");  // 显式指定类型参数,result2的类型为string
let result3 = identity<number[]>([1, 2, 3]);  // 显式指定类型参数,result3的类型为number[]

在这些示例中,我们可以看到泛型函数的灵活性。在第一个示例中,编译器通过类型推断确定了arg的类型为number,因此返回值的类型也是number。在第二个示例中,我们显式指定了类型参数string,因此返回值的类型也是string。在第三个示例中,我们显式指定了类型参数number[],因此返回值的类型也是number[]。 泛型函数可以用于各种类型的操作,并能够在编译时进行类型检查和类型推断,确保类型的一致性和安全性。通过使用泛型函数,我们可以编写更通用、更灵活的函数,适应不同类型的输入和输出。

泛型函数的典型使用

泛型函数能够提供编写通用、灵活和类型安全的代码的能力,并在不同的场景中提供不同的功能。 身份函数(Identity Function):泛型函数可以作为一个身份函数,即接受任意类型的参数并返回相同类型的值。这种函数在需要保持数据类型不变的情况下非常有用。

ts
function identity<T>(arg: T): T {
  return arg;
}

let result1 = identity(10);  // 类型推断,result1的类型为number
let result2 = identity<string>("hello");  // 显式指定类型参数,result2的类型为string

数组操作函数:泛型函数可以用于对数组进行各种操作,例如翻转、过滤、映射等。这样可以减少代码的重复,并且保持类型的一致性。

ts
function reverseArray<T>(arr: T[]): T[] {
  return arr.reverse();
}

function filterArray<T>(arr: T[], predicate: (item: T) => boolean): T[] {
  return arr.filter(predicate);
}

function mapArray<T, U>(arr: T[], mapper: (item: T) => U): U[] {
  return arr.map(mapper);
}

let numbers = [1, 2, 3, 4, 5];
let reversedNumbers = reverseArray(numbers);  // 类型为number[]
let evenNumbers = filterArray(numbers, (num) => num % 2 === 0);  // 类型为number[]
let doubledNumbers = mapArray(numbers, (num) => num * 2);  // 类型为number[]

泛型类方法:泛型函数也可以用于类的方法中,使其能够适用于多种类型。这种使用方式经常出现在数据结构或算法的实现中。

ts
class Queue<T> {
  private elements: T[] = [];

  enqueue(item: T): void {
    this.elements.push(item);
  }

  dequeue(): T | undefined {
    return this.elements.shift();
  }
}

let numberQueue = new Queue<number>();
numberQueue.enqueue(10);
numberQueue.enqueue(20);
let firstNumber = numberQueue.dequeue();  // 类型推断,firstNumber的类型为number

let stringQueue = new Queue<string>();
stringQueue.enqueue("hello");
stringQueue.enqueue("world");
let firstString = stringQueue.dequeue();  // 类型推断,firstString的类型为string

仅用于培训和测试,通过使用本站代码内容随之而来的风险与本站无关。版权所有,未经授权请勿转载,保留一切权利。
ICP备案号:滇ICP备15009214号-13   公安网备:滇公网安备 53312302000061号