2025-05-19 10:50:44
459

TypeScript 中的泛型(Generics)如何使用?

摘要
在TypeScript中,泛型(Generics)是编写灵活且可重用的代码组件的关键特性。通过使用泛型,我们可以创建函数、接口和类,而无需提前确定具体的类型。这使得代码更加通用,并且可以适应多种数据类型的输入。 2. 什么是泛型? 泛型允许我们在定义函数、接口或类时,不预先指定具体的类型,而是使用一个占位符(即类型参数…...

在TypeScript中,泛型(Generics)是编写灵活且可重用的代码组件的关键特性。通过使用泛型,我们可以创建函数、接口和类,而无需提前确定具体的类型。这使得代码更加通用,并且可以适应多种数据类型的输入。

TypeScript 中的泛型(Generics)如何使用?

2. 什么是泛型?

泛型允许我们在定义函数、接口或类时,不预先指定具体的类型,而是使用一个占位符(即类型参数)。当实际使用这些组件时,可以传入具体的类型来替换占位符。这样不仅可以提高代码的复用性,还能保持严格的类型检查。

3. 基本语法

在TypeScript中,泛型的基本语法是在定义函数、接口或类时,在名称后面跟上一对尖括号<T>,其中T就是类型参数。例如:

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

在这个例子中,identity函数接受一个参数arg,它的类型由调用者提供。函数返回值的类型也是T

4. 使用泛型函数

要使用带有泛型的函数,可以在调用时显式地指定类型参数,也可以让TypeScript根据传入的参数自动推断类型。例如:

let output = identity<string>("hello");

这里我们显式地指定了类型为string。TypeScript也能够自动推断出参数的类型:

let output = identity("hello");

5. 泛型接口

除了函数,我们还可以为接口定义泛型。这对于创建通用的数据结构非常有用。例如:

interface Box<T> { value: T; }

这个接口表示一个包含某种类型值的盒子。我们可以用它来创建不同类型的盒子:

let stringBox: Box<string> = { value: "hello" };

let numberBox: Box<number> = { value: 42 };

6. 泛型类

与接口类似,我们也可以为类定义泛型。这使得我们可以创建可以处理不同类型数据的类实例。例如:

class Stack<T> { private items: T[] = []; push(item: T) { this.items.push(item); } pop(): T | undefined { return this.items.pop(); } }

这个Stack类可以用来存储任何类型的元素。我们可以创建一个字符串栈和一个数字栈:

let stringStack = new Stack<string>(); stringStack.push("hello"); let numberStack = new Stack<number>(); numberStack.push(42);

7. 多个类型参数

有时候我们需要多个类型参数来描述更复杂的关系。例如:

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

这里的map函数接受一个数组和一个映射函数作为参数,返回一个新的数组。输入数组的元素类型为T, 输出数组的元素类型为U

8. 默认类型参数

TypeScript还支持为泛型指定默认类型。如果调用者没有提供类型参数,则会使用默认类型。例如:

function loggingIdentity<T = string>(arg: T): T { console.log(arg.length); // Error if T is not a string or an array return arg; }

在这个例子中,如果没有指定类型参数,T将默认为string

9. 结论

通过理解和掌握TypeScript中的泛型,我们可以编写更加灵活和可重用的代码。泛型不仅提高了代码的抽象层次,还确保了类型安全。无论是函数、接口还是类,泛型都为我们提供了强大的工具,使我们的程序更加健壮和易于维护。

声明:文章不代表云主机测评网观点及立场,不构成本平台任何投资建议。投资决策需建立在独立思考之上,本文内容仅供参考,风险自担!转载请注明出处!侵权必究!
回顶部