在 TypeScript 中,泛型(Generics)是一种使函数、类和接口能够处理不同类型数据的工具。
TS也有泛型,让我回忆起学java泛型的时候
在 Java 中,泛型主要有以下几个作用:
1. 类型安全:泛型可以在编译时进行类型检查,避免了类型转换错误。如果在使用泛型集合(如 `List` 、`Set` 等)时,放入了不恰当的类型元素,编译器会报错,限制了传入参数的类型,从而提高了程序的健壮性。
2. 代码复用:通过使用泛型,可以编写能够处理多种数据类型的通用代码,而无需为每种类型都编写单独的版本。
3. 提高可读性:明确了代码所操作的数据类型,使代码更易于理解和维护。
例如,下面是一个简单的泛型类的示例,用于创建一个可以存储任意类型元素的栈:
import java.util.ArrayList; class Stack<T> { private ArrayList<T> elements = new ArrayList<>(); public void push(T element) { elements.add(element); } public T pop() { if (!elements.isEmpty()) { return elements.remove(elements.size() - 1); } return null; } public static void main(String[] args) { Stack<String> stringStack = new Stack<>(); stringStack.push("Hello"); String poppedString = stringStack.pop(); Stack<Integer> integerStack = new Stack<>(); integerStack.push(10); Integer poppedInteger = integerStack.pop(); } } 在上述示例中,`Stack` 类通过泛型可以用于存储不同类型的数据,同时保证了类型安全和代码的复用性。
那么在ts中的泛型呢,
它提供了一种在编写代码时不指定具体类型,而是在使用时再确定类型的机制,从而增加了代码的灵活性和复用性。 以下是一个使用泛型函数的示例:
function identity<T>(arg: T): T { return arg; } let output = identity<string>("Hello");
在上述示例中,`identity` 是一个泛型函数,`T` 是类型参数。
<T>
定义了一个泛型类型参数T
。这意味着这个函数可以接受任意类型的参数。arg: T
表示参数arg
的类型是之前定义的泛型类型T
。: T
表示函数的返回值类型也是这个泛型类型T
。
调用函数时指定了具体的类型 `string` 。 泛型也可以用于类和接口。
例如,一个泛型类:
class GenericNumber<T> { zeroValue: T; add: (x: T, y: T) => T; }
class GenericNumber<T>
定义了一个泛型类 GenericNumber
,其中 T
是泛型类型参数。
zeroValue: T;
定义了一个属性 zeroValue
,其类型为泛型类型 T
。
add: (x: T, y: T) => T;
定义了一个方法 add
,它接受两个类型为 T
的参数 x
和 y
,并返回一个类型为 T
的值。
这使得 GenericNumber
类可以在实例化时指定具体的类型来处理不同类型的数据,从而增加了类的灵活性和通用性。
let myGenericNumber = new GenericNumber<number>(); myGenericNumber.zeroValue = 0; myGenericNumber.add = (x, y) => x + y;
通过使用泛型,可以编写更通用、可重用且类型安全的代码。
Java:
- 泛型在编译时进行类型擦除,运行时不保留泛型信息。
- 可以用于类、接口和方法。
- 语法上通过
<>
来指定类型参数。
TypeScript:
- 类型系统是结构性的,泛型在类型检查时发挥作用。
- 广泛应用于函数、类和接口。
- 提供了灵活的泛型编程能力。