TypeScript 类与泛型实践全解析
在 TypeScript 中,类是构建面向对象编程的核心。例如,我们定义一个简单的 User 类:
typescript
class User { constructor(public name: string, public age: number) {}
sayHello() {
console.log(Hello, my name is ${this.name} and I'm ${this.age} years old.);
}
}
let user = new User('John', 30); user.sayHello();
上述代码创建了 User 类,它具有 name 和 age 属性以及 sayHello 方法。
而泛型则为代码的复用性和灵活性带来了巨大提升。泛型允许我们编写可以处理多种数据类型的组件,而不是针对特定类型编写重复代码。比如,我们创建一个简单的函数来获取数组中的最后一个元素:
typescript
function getLastElement(array: T[]): T | undefined { return array.length? array[array.length - 1] : undefined; }
let numbers = [1, 2, 3, 4, 5]; console.log(getLastElement(numbers));
let strings = ['a', 'b', 'c']; console.log(getLastElement(strings));
这里的 是泛型类型参数, T 可以代表任何类型。函数 getLastElement 可以接受不同类型的数组,并返回相应类型的最后一个元素或 undefined 。
类型约束在泛型中起着关键作用,它能增加代码的安全性。假设我们有一个函数,用于比较两个值是否相等,但要求这两个值必须具有 length 属性(像字符串或数组那样):
typescript
function areEqual<T extends { length: number }>(a: T, b: T): boolean { return a.length === b.length; }
let str1 = "hello"; let str2 = "world"; console.log(areEqual(str1, str2));
let arr1 = [1, 2, 3]; let arr2 = [4, 5, 6]; console.log(areEqual(arr1, arr2));
通过 T extends { length: number } 的类型约束,确保了传入 areEqual 函数的参数具有 length 属性,避免了错误类型的传入,增强了代码的安全性和可靠性。
在类中使用泛型同样强大。例如,创建一个简单的缓存类:
typescript
class Cache { private data: { [key: string]: T } = {};
setItem(key: string, value: T) { this.data[key] = value; }
getItem(key: string): T | undefined { return this.data[key]; } }
let stringCache = new Cache(); stringCache.setItem('name', 'John'); console.log(stringCache.getItem('name'));
let numberCache = new Cache(); numberCache.setItem('age', 30); console.log(numberCache.getItem('age'));
这个 Cache 类可以根据指定的类型来存储和获取数据,通过泛型实现了对不同类型数据的缓存功能,提高了代码的复用性和灵活性,适用于多种数据存储场景。