📜  TypeScript泛型(1)

📅  最后修改于: 2023-12-03 15:20:43.630000             🧑  作者: Mango

TypeScript泛型介绍

什么是泛型?

泛型是在编程中用于增强代码重用性和类型安全的强大工具。它允许我们编写可以用于多种类型的代码,而不仅仅限制于一种具体类型。泛型可以应用于函数、类、接口等各种代码结构。在TypeScript中,泛型通过使用类型参数来实现。

泛型函数

泛型函数是一种能够接受不同类型参数的函数。使用泛型函数可以编写更通用的代码,并且提供更好的类型检查。下面是一个使用泛型函数的示例:

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

// 使用泛型函数
const numbers = [1, 2, 3, 4, 5];
const reversedNumbers = reverse<number>(numbers);  // 返回类型为number[]

在上面的示例中,reverse函数接受一个数组参数arr,并返回一个反转后的数组。<T>表示泛型类型参数,告诉编译器我们希望在调用该函数时动态确定类型。在使用泛型函数时,我们可以通过<number>语法来指定泛型类型为number

泛型类

泛型类是一种能够接受不同类型参数的类。使用泛型类可以编写更通用的类定义,使其可以适用于多种类型。下面是一个使用泛型类的示例:

class Container<T> {
  private value: T;

  constructor(value: T) {
    this.value = value;
  }

  getValue(): T {
    return this.value;
  }
}

// 使用泛型类
const container = new Container<number>(5);  // 创建一个存储number类型值的容器
const value = container.getValue();  // 返回类型为number

在上面的示例中,Container类接受一个类型参数T,并具有一个泛型属性value以及一个返回泛型类型的方法getValue。在使用泛型类时,我们通过<number>语法来指定泛型类型为number

泛型接口

泛型接口是一种能够接受不同类型参数的接口。使用泛型接口可以定义更通用的接口规范。下面是一个使用泛型接口的示例:

interface Pair<T, U> {
  first: T;
  second: U;
}

// 使用泛型接口
const pair: Pair<number, string> = {
  first: 10,
  second: "hello",
};

在上面的示例中,Pair接口接受两个类型参数TU,并定义了两个属性firstsecond,分别对应不同的类型参数。在使用泛型接口时,我们通过<number, string>语法来指定泛型类型为numberstring

泛型约束

泛型约束允许我们对泛型类型进行限制,以确保满足某些特定条件。通过使用泛型约束,我们可以对泛型类型进行更精确的类型推断和操作。下面是一个使用泛型约束的示例:

interface Printable {
  print(): void;
}

function printItem<T extends Printable>(item: T) {
  item.print();
}

// 使用泛型约束
class Book implements Printable {
  print() {
    console.log("Printing book...");
  }
}

printItem(new Book());  // 输出 "Printing book..."

在上面的示例中,Printable是一个接口,要求实现类必须有print方法。泛型函数printItem接受一个泛型参数T,并通过extends Printable进行泛型约束,表示T必须满足Printable接口的要求。在使用泛型函数时,我们传入一个Book实例,因为Book实现了Printable接口,所以可以成功调用print方法。

泛型是TypeScript中一个非常强大和灵活的特性,它能够提高代码的可重用性和类型安全性。通过使用泛型,我们可以编写更通用的代码,并且在编译时获得更好的类型检查。