在TypeScript的编程实践里,类与泛型是构建稳健且灵活代码架构的关键“砖石”,巧妙运用能极大提升开发体验与项目质量。 泛型,可谓“类型世界的变量”,其使用方法核心在于参数化类型。以常见数组操作函数为例,在纯JavaScript中, push 方法能接纳任意类型数据进数组,可这易埋下隐患。TypeScript里,定义函数 function processArray(arr: T[]): T[] { return arr.map(item => item); } , 便是泛型声明, T 作为类型占位,调用 processArray(['a', 'b']) 时,就锁定操作的是字符串数组,保障类型统一、代码逻辑不出错。 泛型适用场景广泛。在数据结构构建上,像链表节点类 class LinkedListNode { value: T; next: LinkedListNode | null; constructor(value: T) { this.value = value; this.next = null; } } , T 让节点存储值类型按需定制,可存数字、字符串、复杂对象等,复用代码应对多样数据需求。接口场景中, interface KeyValuePair<T, U> { key: T; value: U; } ,创建 KeyValuePair<number, string> 实例,清晰界定键值类型,适配如配置项管理场景,不同设置对应各异类型键值对,增强类型严谨性。 类型约束则是给泛型“系紧安全带”,添灵活性同时加固安全性。借助 extends 关键字,定义 function printLength<T extends { length: number }>(obj: T): number { return obj.length; } ,限定 T 需含 length 属性,像数组、字符串调用没问题,但若传普通数字会报错,既包容含 length 的多种类型,又排除不符规则的输入,规避运行时因类型不当引发异常。再如类继承场景, class Animal { move() { console.log('Moving'); } } class Dog extends Animal {} function makeAnimalMove(animal: T): void { animal.move(); } , T 约束为 Animal 或其子类,确保传入对象有 move 方法可安全调用,维护代码结构稳定,适应新增子类拓展,灵活却不失控。 实践中,开发数据处理模块,用泛型定义通用筛选函数 function filterArray(arr: T[], predicate: (item: T) => boolean): T[] ,配合类型约束 T extends { id: number } 处理含 id 数据,适配多类实体数组筛选,不同业务实体只需契合 id 规则即可复用,降低代码冗余,借类型系统把关,将错误拦截在编译阶段,为项目筑牢类型“安全网”,让TypeScript高效驾驭复杂开发需求。 设想构建一个通用的本地缓存数据存储类,能应对不同类型数据的存取操作。 class LocalStorage { private key: string; constructor(key: string) { this.key = key; } // 存储数据方法,接受对应泛型类型的数据 setData(data: T): void { localStorage.setItem(this.key, JSON.stringify(data)); } // 获取数据方法,返回对应泛型类型的数据 getData(): T | null { const item = localStorage.getItem(this.key); return item? JSON.parse(item) : null; } } // 使用示例,存储数字类型数据 const numberStorage = new LocalStorage('number-key'); numberStorage.setData(5); const retrievedNumber = numberStorage.getData(); // 使用示例,存储对象类型数据 interface User { name: string; age: number; } const userStorage = new LocalStorage('user-key'); const user: User = { name: 'John', age: 30 }; userStorage.setData(user); const retrievedUser = userStorage.getData(); 在此例中, LocalStorage 类借助泛型 ,可适配多种数据类型。通过 setData 和 getData 方法,既能存储如 number 这般简单类型,也能处理像自定义 User 接口复杂对象类型的数据,避免为不同类型分别编写存储类,提升代码复用性与可维护性。