TypeScript 类、泛型的使用实践 | 豆包MarsCode AI刷题

39 阅读2分钟

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  类可以根据指定的类型来存储和获取数据,通过泛型实现了对不同类型数据的缓存功能,提高了代码的复用性和灵活性,适用于多种数据存储场景。