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

138 阅读6分钟

TypeScript 中的泛型

1. 泛型的概念

泛型是一种类型抽象机制,允许我们在定义函数、接口和类的时候,不预先指定具体的类型,而在使用的时候再指定具体的类型。这样可以增加代码的复用性和灵活性。

2. 泛型的使用方法和场景
2.1 泛型函数

泛型函数允许我们在调用函数时指定类型参数。

示例代码

function identity<T>(arg: T): T {
  return arg;
}

let output = identity<string>("myString"); // 输出: myString

分析

  • 泛型参数<T> 表示这是一个泛型函数,T 是一个类型参数。
  • 类型推断:在调用 identity 函数时,编译器可以根据传入的参数类型自动推断 T 的具体类型。
2.2 泛型接口

泛型接口允许我们在定义接口时使用类型参数。

示例代码

interface Box<T> {
  content: T;
}

let box: Box<string> = { content: "Hello World" };

分析

  • 泛型接口Box<T> 表示 Box 接口可以接受任何类型的 content
  • 类型指定:在声明变量 box 时,指定了 Box 的具体类型为 string
2.3 泛型类

泛型类允许我们在定义类时使用类型参数。

示例代码

class GenericNumber<T> {
  zeroValue: T;
  add: (x: T, y: T) => T;
}

let myGenericNumber = new GenericNumber<number>();
myGenericNumber.zeroValue = 0;
myGenericNumber.add = function(x, y) { return x + y; };

分析

  • 泛型类GenericNumber<T> 表示 GenericNumber 类可以接受任何类型的 zeroValueadd 方法的参数。
  • 实例化:在创建 myGenericNumber 实例时,指定了 GenericNumber 的具体类型为 number
2.4 泛型约束

使用类型约束可以限制泛型参数的类型,确保它们具有某些特定的方法或属性。

示例代码

interface Lengthwise {
  length: number;
}

function loggingIdentity<T extends Lengthwise>(arg: T): T {
  console.log(arg.length); // 现在编译器知道 arg 具有 length 属性
  return arg;
}

loggingIdentity({ length: 10, value: 3 }); // 正确
loggingIdentity(42); // 错误,42 没有 length 属性

分析

  • 泛型约束<T extends Lengthwise> 表示 T 必须实现 Lengthwise 接口。
  • 类型检查:在调用 loggingIdentity 函数时,编译器会检查传入的参数是否具有 length 属性。

体验与成长

使用 AI 刷题功能对自己学习的积极影响

1. 更高效地掌握编程思维
  • 即时反馈:每次提交代码后,AI 刷题平台会立即给出结果和评分,帮助我快速发现和修正错误。
  • 多样化题目:平台提供了丰富的题目类型,涵盖了算法、数据结构等多个领域,帮助我全面提高编程能力。
  • 动态难度调整:根据我的答题情况,平台智能推荐合适的题目,确保我始终处于最佳学习状态。
2. 知识掌握程度的变化
  • 基础知识巩固:通过大量的基础题目练习,我对基本的编程概念和语法有了更深刻的理解。
  • 高级技能提升:挑战一些高难度的题目,使我掌握了更复杂的算法和数据结构。
  • 实战经验积累:通过模拟真实的编程竞赛和面试题目,我积累了宝贵的实战经验。

刷题故事

在使用 AI 刷题功能过程中发生的难忘故事

1. 攻克一道难题后的喜悦

有一次,我遇到了一道非常棘手的动态规划题目,尝试了多次都无法通过所有测试用例。我几乎要放弃了,但在 AI 刷题平台的提示和解析的帮助下,我终于找到了问题所在,并成功解决了这道题目。那一刻,我感到无比的喜悦和成就感。

2. 与同学一起使用刷题功能互相竞争进步的经历

我和几位同学一起参加了平台上的刷题比赛。我们每天都会互相分享解题思路和技巧,互相鼓励和支持。通过这种合作竞争的方式,我们的编程能力都得到了显著提升。最终,我们中的几个人还获得了比赛的奖项,这让我们更加坚定了继续学习的决心。

AI 认知

对 AI 技术在教育领域应用的看法和感悟

1. AI 技术的优势
  • 个性化教学:AI 能够根据每个学生的学习情况和特点,提供个性化的教学方案,使学习更加高效。
  • 即时反馈:AI 可以实时提供反馈,帮助学生及时发现和纠正错误,提高学习效果。
  • 互动性:AI 平台提供了丰富的互动功能,如讨论区、在线答疑等,增强了学习的互动性和趣味性。
2. AI 刷题功能的改变
  • 学习认知:使用 AI 刷题功能后,我对学习的认知发生了很大的变化。我意识到学习不仅仅是被动接受知识,更是一个主动探索和解决问题的过程。
  • 自主学习:AI 平台的智能化推荐和即时反馈功能,使我能够更加自主地安排学习计划,提高了学习的自主性和积极性。

方向三:实践记录以及工具使用

实践记录

1. 类和泛型的综合应用

在实际项目中,我经常使用 TypeScript 的类和泛型来提高代码的复用性和灵活性。例如,在一个数据管理模块中,我定义了一个泛型类来处理不同类型的数据。

示例代码

class DataManager<T> {
  private data: T[];

  constructor() {
    this.data = [];
  }

  add(item: T): void {
    this.data.push(item);
  }

  get(index: number): T {
    return this.data[index];
  }

  getAll(): T[] {
    return this.data;
  }
}

let stringManager = new DataManager<string>();
stringManager.add("Hello");
stringManager.add("World");

console.log(stringManager.getAll()); // 输出: ["Hello", "World"]

分析

  • 泛型类DataManager<T> 允许处理任何类型的 data
  • 方法实现addgetgetAll 方法分别用于添加、获取和获取所有数据。
  • 实例化stringManager 实例处理字符串类型的数据。
2. 类型约束的应用

在处理复杂数据结构时,使用类型约束可以确保数据的正确性和一致性。例如,定义一个处理用户信息的类时,可以使用类型约束来确保用户对象具有必要的属性。

示例代码

interface User {
  id: number;
  name: string;
}

class UserManager<T extends User> {
  private users: T[];

  constructor() {
    this.users = [];
  }

  addUser(user: T): void {
    this.users.push(user);
  }

  getUserById(id: number): T | undefined {
    return this.users.find(user => user.id === id);
  }
}

let userManager = new UserManager<User>();
userManager.addUser({ id: 1, name: "Alice" });
userManager.addUser({ id: 2, name: "Bob" });

console.log(userManager.getUserById(1)); // 输出: { id: 1, name: "Alice" }

分析

  • 泛型约束UserManager<T extends User> 确保 T 必须实现 User 接口。
  • 方法实现addUser 方法用于添加用户,getUserById 方法用于根据 id 获取用户。
  • 实例化userManager 实例处理 User 类型的数据。

总结

通过使用 TypeScript 的类和泛型,我能够编写出更加灵活和安全的代码。同时,借助豆包 MarsCode AI 刷题平台,我不仅高效地提升了编程能力,还在学习过程中体验到了很多乐趣和成就感。希望这些经验和心得能够帮助其他同学更好地利用这些工具和技术,提升自己的编程水平。如果你有任何具体的问题或者需要进一步的帮助,请随时告诉我。