返回

揭秘TypeScript泛型之妙:提升灵活性,代码逻辑更清晰

前端

TypeScript 泛型初探:

泛型,本质上是一种类型参数化技术,可以让代码适应不同的数据类型,提升代码的复用性和灵活性。在 TypeScript 中,泛型使用尖括号 <> 表示,泛型类型变量紧随其中。

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

let str = identity("Hello");
let num = identity(10);

这段代码中,identity 函数使用了泛型类型变量 T,它表示函数可以接受任何类型的数据,并返回相同类型的数据。这使得 identity 函数可以通用地应用于字符串、数字或任何其他类型。

TypeScript 中的常见泛型类型:

1. 数组泛型:

TypeScript 中的数组类型也可以是泛型的,使用尖括号 <> 表示数组元素的类型。

let arr: Array<number> = [1, 2, 3];

这段代码中,arr 变量被声明为一个数字类型的数组。这使得数组中的每个元素都必须是数字,否则会报错。

2. 对象泛型:

TypeScript 中的对象类型也可以是泛型的,使用尖括号 <> 表示对象属性的类型。

interface Person<T> {
  name: string;
  age: T;
}

let person1: Person<number> = { name: "John", age: 30 };
let person2: Person<string> = { name: "Mary", age: "thirty" };

这段代码中,Person 接口定义了一个泛型类型变量 T,它表示对象属性 age 的类型。这使得 Person 接口可以用于表示不同类型的数据,如数字、字符串等。

3. 函数泛型:

TypeScript 中的函数类型也可以是泛型的,使用尖括号 <> 表示函数参数和返回值的类型。

function add<T>(x: T, y: T): T {
  return x + y;
}

let sum1 = add(1, 2);
let sum2 = add("Hello", "World");

这段代码中,add 函数使用了泛型类型变量 T,它表示函数参数和返回值的类型。这使得 add 函数可以通用地用于计算不同类型数据的和。

TypeScript 泛型的高级用法:

1. 泛型约束:

泛型约束可以限制泛型类型变量的范围,以确保代码的正确性和安全性。

function min<T extends number>(x: T, y: T): T {
  return x < y ? x : y;
}

let min1 = min(1, 2);

这段代码中,min 函数使用了泛型类型变量 T,并使用 extendsT 进行了约束,要求 T 必须是 number 类型或其子类型。这确保了 min 函数只能用于比较数字类型的数据。

2. 泛型接口:

泛型接口可以定义具有泛型类型的属性和方法。

interface Stack<T> {
  push(item: T): void;
  pop(): T;
  peek(): T;
}

class NumberStack implements Stack<number> {
  private stack: number[] = [];

  push(item: number): void {
    this.stack.push(item);
  }

  pop(): number {
    return this.stack.pop();
  }

  peek(): number {
    return this.stack[this.stack.length - 1];
  }
}

这段代码中,Stack 接口定义了一个泛型类型变量 T,表示栈中元素的类型。NumberStack 类实现了 Stack 接口,并指定了元素类型为 number。这使得 NumberStack 类可以用于存储数字类型的数据。

3. 泛型类:

泛型类可以定义具有泛型类型的属性和方法。

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

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

  dequeue(): T {
    return this.queue.shift();
  }

  peek(): T {
    return this.queue[0];
  }
}

这段代码中,Queue 类定义了一个泛型类型变量 T,表示队列中元素的类型。这使得 Queue 类可以用于存储任何类型的数据。

结语:

TypeScript 中的泛型是一种非常强大的工具,它可以极大地提高代码的灵活性、复用性和安全性。掌握泛型是 TypeScript 进阶开发必备的技能。在实际项目中,泛型可以用于构建各种数据结构、算法和通用函数。