TypeScript泛型

2023-05-22 10:29:11 浏览数 (1)

在 TypeScript 中,泛型(Generics)是一种用于创建可重用的组件的强大工具。泛型允许在函数、类和接口中使用类型参数,使得这些组件能够适应多种数据类型,提高代码的灵活性和可重用性。

泛型函数

泛型函数是一种可以接受不同类型参数的函数。通过使用尖括号 <T> 来定义类型参数,并在函数参数、返回值或函数体中使用类型参数,可以实现泛型函数的功能。

代码语言:javascript复制
function identity<T>(value: T): T {
  return value;
}

let result1 = identity<string>("Hello");
let result2 = identity<number>(42);

console.log(result1); // 输出: "Hello"
console.log(result2); // 输出: 42

在上面的例子中,identity 函数使用了泛型类型参数 T。函数接受一个参数 value,类型为 T,并返回值也为 T。通过调用 identity 函数并显式指定类型参数,可以传递不同类型的值,得到相应类型的返回结果。

泛型类

泛型类是一种具有类型参数的类。通过在类名后面使用尖括号 <T> 来定义类型参数,并在类的属性、方法或构造函数中使用类型参数,可以创建可适用于多种类型的类。

代码语言:javascript复制
class Container<T> {
  private value: T;

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

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

let container1 = new Container<string>("Hello");
let container2 = new Container<number>(42);

console.log(container1.getValue()); // 输出: "Hello"
console.log(container2.getValue()); // 输出: 42

在上面的例子中,Container 类使用了泛型类型参数 T。类的构造函数接受一个参数 value,类型为 T,并将其赋值给私有属性 value。通过调用 getValue 方法,可以获取存储在容器中的值,其类型为 T

泛型接口

泛型接口是一种具有类型参数的接口。通过在接口名后面使用尖括号 <T> 来定义类型参数,并在接口的属性或方法中使用类型参数,可以定义适用于多种类型的接口。

代码语言:javascript复制
interface Printer<T> {
  print(value: T): void;
}

class ConsolePrinter<T> implements Printer<T> {
  print(value: T): void {
    console.log(value);
  }
}

let printer1: Printer<string> = new ConsolePrinter<string>();
let printer2: Printer<number> = new ConsolePrinter<number>();

printer1.print("Hello"); // 输出: "Hello"
printer2.print(42); // 输出: 42

在上面的例子中,我们定义了一个泛型接口 Printer<T>,其中包含一个 print 方法。然后,我们创建了一个实现了该接口的类 ConsolePrinter<T>,并在其 print 方法中使用 console.log 打印传入的值。通过声明类型为 Printer<string>Printer<number> 的变量,我们可以分别创建适用于字符串和数字的打印器,并调用其 print 方法。

泛型约束

有时候我们希望泛型类型参数具有某些特定的属性或方法。为了达到这个目的,可以使用泛型约束(Generic Constraints)。

代码语言:javascript复制
interface Lengthy {
  length: number;
}

function getLength<T extends Lengthy>(value: T): number {
  return value.length;
}

let length1 = getLength("Hello"); // 返回字符串的长度 5
let length2 = getLength([1, 2, 3, 4, 5]); // 返回数组的长度 5

在上面的例子中,我们定义了一个接口 Lengthy,该接口包含一个 length 属性。然后,我们定义了一个泛型函数 getLength,该函数接受一个泛型类型参数 T,并使用泛型约束 T extends Lengthy,表示 T 必须具有 Lengthy 接口中定义的属性。函数返回传入值的 length 属性。

0 人点赞