揭秘TypeScript泛型之妙:提升灵活性,代码逻辑更清晰
2023-11-03 10:39:49
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
,并使用 extends
对 T
进行了约束,要求 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 进阶开发必备的技能。在实际项目中,泛型可以用于构建各种数据结构、算法和通用函数。