TypeScript 中的泛型是一种强大的工具,它可以增加代码的灵活性和安全性。泛型允许你编写可重用的代码组件,同时保持类型检查。在本文中,我将分享一些围绕 TypeScript 类和泛型的使用实践,以及如何使用类型约束来提高代码的质量。
1. 简单的泛型示例
首先,让我们从一个简单的泛型示例开始,以理解泛型的基本概念:
// 使用泛型创建一个可重用的数组反转函数
function reverseArray<T>(array: T[]): T[] {
return array.reverse();
}
const numbers = [1, 2, 3, 4, 5];
const reversedNumbers = reverseArray(numbers); // 类型推断:reversedNumbers 是 number[] 类型
const strings = ["apple", "banana", "cherry"];
const reversedStrings = reverseArray(strings); // 类型推断:reversedStrings 是 string[] 类型
在上面的示例中,reverseArray 函数接受一个泛型类型 T 的数组,并返回一个相同类型的数组。通过这种方式,你可以在不同类型的数组上使用相同的函数,而且 TypeScript 会进行类型检查。
2. 类中的泛型
你还可以在类中使用泛型。这对于创建通用的数据结构非常有用。例如,创建一个通用的堆栈(stack)类:
class Stack<T> {
private items: T[] = [];
push(item: T): void {
this.items.push(item);
}
pop(): T | undefined {
return this.items.pop();
}
size(): number {
return this.items.length;
}
}
const numberStack = new Stack<number>();
numberStack.push(1);
numberStack.push(2);
console.log(numberStack.pop()); // 输出: 2
const stringStack = new Stack<string>();
stringStack.push("hello");
stringStack.push("world");
console.log(stringStack.pop()); // 输出: "world"
这个通用的堆栈类可以存储不同类型的数据,并且在使用时 TypeScript 会进行类型检查。
3. 类型约束
有时候,你希望泛型类型满足某些条件。这时可以使用类型约束来增加代码的安全性。例如,你想确保泛型类型具有某个特定方法:
interface HasLength {
length: number;
}
function logLength<T extends HasLength>(item: T): void {
console.log(item.length);
}
logLength("hello"); // 输出: 5
logLength([1, 2, 3]); // 输出: 3
logLength({ length: 10 }); // 输出: 10
logLength(42); // 错误:数字类型没有 length 属性
在上面的示例中,我们使用了 extends 关键字来约束泛型 T 必须具有 length 属性。这样可以避免在不具备 length 属性的数据上调用 logLength 函数。
4. 多重泛型参数
有时候,你可能需要多个泛型参数来增加灵活性。例如,你想创建一个键值对存储器:
class KeyValuePair<K, V> {
private data: Record<K, V> = {};
set(key: K, value: V): void {
this.data[key] = value;
}
get(key: K): V | undefined {
return this.data[key];
}
}
const store = new KeyValuePair<string, number>();
store.set("age", 30);
console.log(store.get("age")); // 输出: 30
在这个例子中,我们使用了两个泛型参数 K 和 V 分别表示键和值的类型。
总结一下,TypeScript 中的泛型是一种非常有用的工具,可以增加代码的灵活性和安全性。你可以在函数、类和接口中使用泛型,并使用类型约束来确保泛型类型满足特定条件。这使得你可以编写更加通用和类型安全的代码。
TypeScript的简单介绍
TypeScript中的类(Class)是一种面向对象编程(OOP)的核心概念,它允许你创建具有属性和方法的自定义数据结构。下面是关于TypeScript类的简要介绍:
-
类的定义: 类是一种蓝图或模板,用于创建具有相似属性和方法的对象。在TypeScript中,可以使用
class关键字来定义类,如下所示: -
属性和构造函数: 类中可以定义属性和构造函数。构造函数用于初始化类的实例,通常用于设置对象的初始状态。属性则用于存储对象的数据。
-
方法: 类中可以包含方法,这些方法是对象可以执行的操作。方法可以访问类的属性和其他方法。
-
实例化: 类定义了对象的结构,但要创建类的实例,需要使用
new关键字: -
继承: TypeScript支持类之间的继承关系。子类可以继承父类的属性和方法,并可以添加自己的属性和方法。
-
访问修饰符: TypeScript支持
public、private和protected等访问修饰符,用于控制属性和方法的可访问性。默认情况下,成员是public的。 -
静态成员: 类可以包含静态属性和方法,这些成员不依赖于类的实例而直接属于类本身。
-
抽象类: 抽象类是不能被实例化的类,它用于定义其他类的结构。抽象类可以包含抽象方法,要求子类必须实现这些方法。
总之,TypeScript中的类是一种强大的工具,用于建模和组织代码,支持面向对象编程的核心概念,包括封装、继承和多态。通过类,你可以创建可重用的代码模块,提高代码的可维护性和可读性。