前端(六)——TypeScript在前端中的重要性与应用

在这里插入图片描述

😊博主:小猫娃来啦
😊文章核心:TypeScript在前端中的重要性与应用

文章目录

  • 什么是TypeScript?
  • TypeScript与JavaScript的关系
  • 如何使用TypeScript
  • TypeScript在前端开发中的应用场景
    • 提升开发效率
    • 减少错误和调试时间
    • 优化团队协作
    • 支持现代Web开发工具和框架
  • TypeScript的发展和趋势
    • 社区支持与贡献
    • 新功能的增加
    • TypeScript在企业级项目中的应用

随着Web应用的复杂性不断增加,开发人员需要更强大的工具来应对这些挑战。TypeScript作为一种静态类型语言,满足了许多开发者对代码质量和可维护性的需求。下面我们将深入探讨TypeScript在前端中的定位。

什么是TypeScript?

TypeScript 是一种开源的编程语言,它是 JavaScript 的一个超集。由于 TypeScript 扩展了 JavaScript,并添加了静态类型系统和其他特性,因此它可以被视为 JavaScript 的增强版。

TypeScript 被设计用来解决 JavaScript 在大型应用开发方面的一些困难和限制。它通过引入静态类型、类、接口、模块化等特性,提供了更强大的工具和功能,有助于构建可维护、可扩展的应用程序。

⭐⭐⭐TS的特点包括:

  • 静态类型检查 TypeScript引入了静态类型系统,允许在编译时进行类型检查,帮助捕获潜在的错误并提供更好的代码提示。这可以减少运行时错误,改善代码可靠性和可维护性。

  • 类和接口 TypeScript 支持类和接口的定义,使得面向对象编程更加简洁和易于理解。它提供了类和继承、访问修饰符(public、private、protected)、接口定义等特性,方便组织和管理代码。

  • 高级 JavaScript 特性支持 TypeScript 支持 ES6、ES7 等最新版本的 JavaScript 语法和特性,同时还引入了自己的一些扩展。这意味着可以使用诸如箭头函数、模板字面量、解构赋值、装饰器等高级特性来编写代码。

  • 工具支持 TypeScript 提供了丰富的工具支持,包括代码编辑器(例如 Visual Studio Code)的智能提示、代码导航和自动完成功能。它还提供了强大的类型推断、重构和代码检查等功能,可以在开发过程中显著提升开发效率。

  • 渐进式采用 与 JavaScript 不同,TypeScript 允许将现有的 JavaScript 代码逐步迁移到 TypeScript。这意味着可以从部分代码开始,在需要时逐步添加类型注解和其他 TypeScript 特性,而不必一次性全面改写。


TypeScript与JavaScript的关系

⭐⭐⭐TypeScript的超集关系

作为JavaScript的超集,TypeScript扩展了JavaScript的功能并添加了静态类型检查。

这意味着在TypeScript中,可以声明变量的数据类型、定义函数参数和返回值的类型,并在编译时进行类型检查。通过类型检查,TypeScript能够在开发过程中捕获潜在的错误,提供更好的代码提示和自动补全,并提高代码的可读性和可维护性。

除了静态类型检查外,TypeScript还支持最新的ECMAScript(JavaScript标准)特性,并提供了面向对象编程的能力,如类、接口、继承、泛型等。此外,TypeScript还拥有强大的工具生态系统,包括编辑器插件、开发工具和第三方库支持,使开发者可以更高效地构建大型应用程序。

⭐⭐⭐TypeScript的特殊语法和特性

  • 类型注解:TypeScript允许声明变量、函数参数和返回值的类型。通过使用类型注解,可以告诉编译器变量的预期类型,从而实现静态类型检查。

  • 接口(Interfaces):接口是TypeScript中定义对象结构的一种方式。可以使用接口来声明对象的属性、方法以及可选的属性和只读属性。

  • 类(Classes):TypeScript支持面向对象编程,可以使用类来定义对象的行为和状态。类可以有属性、方法、构造函数和继承等特性。

  • 泛型(Generics):泛型能够增加代码的灵活性和重用性。可以使用泛型在编写可复用的函数、类和接口时处理不同类型的数据。

  • 类型推断:TypeScript具有类型推断功能,即在某些情况下,编译器可以根据上下文自动推断变量的类型,无需显式注解。

  • 模块化与命名空间(Modules & Namespaces):TypeScript支持模块化开发,可以使用import和export关键字导入和导出模块。另外,命名空间(Namespace)提供了一种组织代码的方式,避免全局命名冲突。

  • 可选参数和默认参数:在函数声明中,TypeScript允许参数使用可选标记(?)或设置默认值,以实现参数的灵活性。

  • 类型别名(Type Aliases):可以使用类型别名来为复杂的类型或联合类型创建自定义名称,使代码更具可读性和可维护性。

  • 枚举(Enums):枚举提供了一种定义命名常量集合的方式。通过枚举,可以为一组相关的常量赋予有意义的名字,并且可以轻松地在代码中引用这些常量。


如何使用TypeScript

⭐⭐⭐安装和配置TypeScript

  • 安装Node.js:首先,确保您已经安装了Node.js。TypeScript需要Node.js环境才能运行。您可以从Node.js的官方网站下载适合您操作系统的安装程序,并按照提示完成安装。

  • 安装TypeScript:一旦Node.js安装完成,您可以使用Node.js自带的包管理器npm来安装TypeScript。打开终端或命令提示符窗口,在命令行中运行以下命令来全局安装TypeScript:

npm install -g typescript

这将在全局范围内安装TypeScript。

  • 配置TypeScript:一旦TypeScript安装完成,您可以创建一个TypeScript项目并进行配置。

a. 创建新项目文件夹:在您选择的位置创建一个新的文件夹,用于存放TypeScript代码和配置文件。

b. 初始化TypeScript项目:在终端或命令提示符窗口中,进入到新创建的项目文件夹,并运行以下命令来初始化TypeScript项目:

tsc --init

这将在项目文件夹中生成一个名为tsconfig.json的TypeScript配置文件。

c. 配置选项:打开生成的tsconfig.json文件,并根据您的项目需求进行配置。该配置文件允许您指定编译输出目录、目标JavaScript版本、启用的特性等。

  • 编写和编译TypeScript代码:使用您喜欢的文本编辑器编写TypeScript代码(以.ts文件扩展名为后缀)。一旦完成,您可以在终端或命令提示符窗口中定位到项目文件夹,并运行以下命令来将TypeScript代码编译为JavaScript代码:
tsc

这将会根据tsconfig.json配置文件中的选项进行编译,生成相应的JavaScript文件。

安装和配置TypeScript后,您就可以开始编写并运行TypeScript代码了。编译生成的JavaScript代码可以在任何支持JavaScript的环境中运行。记得在运行时使用JavaScript文件而不是TypeScript文件。

这是一个基本的TypeScript安装和配置过程的概述。更多高级的配置选项和常用工作流程可以参考TypeScript官方文档

⭐⭐⭐编写TypeScript代码

上一步做完以后,就可以开始写ts的代码了

  • 创建一个新的TypeScript文件,例如 app.ts
  • 在文件中编写TypeScript代码:
// 定义一个接口
interface Person {name: string;age: number;
}// 定义一个函数,接收一个Person类型的参数并打印信息
function sayHello(person: Person) {console.log(`Hello, ${person.name}! You are ${person.age} years old.`);
}// 创建一个Person对象并调用sayHello函数
const person: Person = {name: 'John',age: 25
};sayHello(person);
  • 使用终端运行以下命令将TypeScript代码转换为JavaScript:
tsc app.ts
  • 该命令会使用TypeScript编译器(tsc)将app.ts文件转换为app.js文件,其中包含与TypeScript代码对应的JavaScript代码。

运行转换后的JavaScript代码:

node app.js

⭐⭐⭐编译和运行TypeScript代码

  • 安装TypeScript:首先,请确保您已经在计算机上安装了Node.js。然后,在终端中运行以下命令来全局安装TypeScript:
npm install -g typescript
  • 创建TypeScript文件:使用任何文本编辑器创建一个新的TypeScript文件,并将其保存为.ts文件扩展名。

  • 编写TypeScript代码:在TypeScript文件中编写您的代码。例如,您可以定义接口、类、函数等。

// 示例代码
interface Person {name: string;age: number;
}function sayHello(person: Person) {console.log(`Hello, ${person.name}! You are ${person.age} years old.`);
}const person: Person = {name: 'John',age: 25
};sayHello(person);
  • 编译TypeScript代码:在终端中导航到包含TypeScript文件的目录,并运行以下命令来编译TypeScript代码:
tsc your-file.ts

此命令将会生成与TypeScript文件相对应的JavaScript文件。

  • 运行JavaScript代码:完成编译后,您可以使用Node.js或在浏览器中引入JavaScript文件来运行代码。

在终端中使用Node.js运行JavaScript文件:

node your-file.js
  • 在HTML文件中引入JavaScript文件并在浏览器中运行。
<!DOCTYPE html>
<html>
<head><title>My TypeScript Example</title>
</head>
<body><script src="your-file.js"></script>
</body>
</html>

上是基本的编译和运行TypeScript代码的步骤。通过这种方式,您可以将TypeScript代码转换为可在Node.js环境或浏览器中执行的JavaScript代码。


TypeScript在前端开发中的应用场景

提升开发效率

  • 使用合适的集成开发环境(IDE):选择一款功能强大、针对TypeScript优化的IDE,如Visual Studio Code。这些IDE通常提供代码自动完成、调试支持、错误检测等功能,有助于提高编码速度和准确性。
  • 利用类型系统:TypeScript的主要特点之一是静态类型检查。合理使用类型注解、接口和类型定义,可以在开发过程中捕获潜在的错误,并提供更好的代码补全和代码导航体验。
  • 充分利用编辑器功能:了解并合理利用您所使用的编辑器或IDE的功能,例如快捷键、代码片段、重构工具等。这些功能能够加快编码速度和提高代码质量。
  • 使用第三方库和框架:借助开源社区中丰富的TypeScript库和框架,您可以节省开发时间,避免重复造轮子。确保选择与TypeScript兼容且受欢迎的库,可以通过npm包管理器进行安装和引用。
  • 使用模块化和组件化开发:将代码拆分为小的模块或组件,使其易于管理和维护。使用模块化开发的方式,可以实现代码的复用和解耦,提高开发效率和代码质量。
  • 编写单元测试:采用测试驱动的开发方法,编写并执行单元测试。这有助于及早发现和修复问题,保证代码的稳定性和可靠性,并增强您的开发信心。
  • 学习和参与社区:阅读TypeScript的官方文档,关注相关博客、论坛和社交媒体上的TypeScript话题,与其他开发人员交流经验和最佳实践。积极参与社区可以使您了解到更多有关TypeScript的互动和资源。
  • 持续学习和改进:TypeScript是一个不断发展和壮大的技术生态系统。始终保持学习状态,关注新的功能和工具,探索如何优化您的工作流程和项目架构。

减少错误和调试时间

  • 强类型约束:TypeScript具有静态类型检查功能,可以在编译时捕获许多潜在的类型错误。通过显式声明变量类型、定义接口和类型,并遵循良好的类型注解习惯,可以帮助发现代码中的类型错误并避免潜在的bug。
  • TypeScript编译器和IDE支持:TypeScript编译器(tsc)和常见的集成开发环境(IDE)如Visual Studio Code提供了强大的语法检查和智能感知能力。利用编译器和IDE的实时错误提示和代码建议功能,可以及早发现问题并快速修复,减少调试时间。
  • 单元测试:编写针对代码逻辑和功能的单元测试,覆盖各种可能的边界情况和预期行为。运行单元测试可以快速发现代码中的逻辑错误,并且在后续修改或重构代码时提供保障。确保拥有高覆盖率的可靠测试套件可以显著减少调试时间。
  • 良好的命名和代码组织:采用清晰的命名规范和合理的代码组织结构,使代码易于阅读和理解。良好的命名可以提高代码的可读性和可维护性,减少出现错误的可能性。同时,通过模块化和文件组织方式,可以快速定位和定位问题所在。
  • 使用调试工具:TypeScript支持在大多数现代浏览器中进行调试。利用浏览器开发者工具或专业的调试工具,如Chrome开发者工具,可以逐步执行代码、检查变量值和调试程序流程,有助于快速定位和解决问题。
  • 团队协作和代码审查:团队成员之间的良好沟通和合作对于快速发现和解决问题至关重要。进行代码审查是一种有效的方法,通过团队成员的集体智慧和经验,可以捕获潜在的问题,提出改进建议,消除错误。
  • 持续集成和自动构建:建立持续集成(CI)系统来自动构建、测试和发布代码。CI系统可在每次提交或合并请求时自动运行构建过程和测试套件,并提供及时的反馈。这样可以确保代码在不同环境中的稳定性和可靠性,减少由于环境配置问题而产生的错误。

优化团队协作

  • 规范代码风格和命名规范:使用统一的代码风格和命名规范,以提高代码的可读性和可维护性。通过制定和遵循规范,可以减少团队成员之间在代码编写和理解方面的差异。
  • 强类型约束和类型检查:TypeScript的最大特点之一是静态类型检查。通过合理地定义接口、类型和类,可以在编码阶段捕获潜在的类型错误,减少运行时错误的发生,提高代码质量和稳定性。
  • 使用模块化和命名空间:利用TypeScript的模块化功能和命名空间来组织代码结构,将代码分解为独立的模块和功能单元。这样可以提高代码的复用性,并使团队成员更容易理解和修改特定部分的代码。
  • 清晰的注释和文档:编写清晰的注释和文档,解释代码的意图、实现方式和注意事项。良好的文档可以帮助团队成员更好地理解代码,加快开发速度,减少不必要的沟通和重复工作。
  • 使用版本控制工具:使用像Git这样的版本控制工具来管理代码,并建立适当的分支策略。团队成员可以更好地合作开发、进行代码审查和解决冲突,确保代码的稳定性和一致性。
  • 单元测试和自动化测试:编写单元测试和自动化测试代码,验证代码的正确性和功能性。这有助于捕获潜在的错误和问题,并增强团队对代码质量的信心。
  • 持续集成和持续交付:建立适当的持续集成(CI)和持续交付(CD)流程,将代码的构建、测试和部署自动化。这样可以减少人工操作和人为失误,提高开发效率和发布质量。
  • 开展团队培训和知识分享:组织定期的团队培训和知识分享会,让团队成员相互学习和了解新的TS技术和最佳实践。这有助于提升整个团队的技术水平和协作能力。

支持现代Web开发工具和框架

  • Angular

Angular是一个流行的前端框架,完全采用TypeScript进行开发,并且为TS提供了深度集成和良好的支持。使用Angular和TypeScript可以享受到强类型检查、模块化、依赖注入等优势,并且能够充分利用IDE的智能感知功能。

  • React

React是另一个广泛使用的前端框架,也有很好的TypeScript支持。通过安装必要的类型定义,开发者可以在React项目中使用TypeScript,并获得类型检查、自动完成和重构等功能。

  • Vue.js

Vue.js是一个易于学习和使用的前端框架,也对TypeScript提供了良好的支持。类似React,Vue.js需要添加相应的类型定义才能与TypeScript无缝集成,从而获得类型检查和IDE支持。

  • Webpack

Webpack是一个常用的模块打包工具,在TypeScript项目中,可以使用Webpack配合ts-loader或awesome-typescript-loader来处理TypeScript文件的编译和打包。Webpack提供了丰富的配置选项,可以满足不同项目的需求。

  • Babel

Babel是一个广泛使用的JavaScript编译工具,用于将最新的JavaScript语法转换为向后兼容的代码。它也可以与TypeScript集成,在项目中使用Babel和相关插件来处理TypeScript文件的编译和转换。

  • ESLint

ESLint是一个可扩展的JavaScript静态代码分析工具,支持使用TypeScript进行代码检查。通过配置相应的ESLint规则和插件,可以在TypeScript项目中进行代码质量和风格的静态检查。


TypeScript的发展和趋势

社区支持与贡献

TypeScript官方网站提供了详细的文档、手册和示例代码,涵盖了从基础到高级的各种主题。这些资源有助于新手入门并深入理解TypeScript语言及其功能。

社区论坛和问答平台:TypeScript社区中存在许多专门的论坛、社区网站和问答平台,例如官方的GitHub Discussions、Stack Overflow等。在这些平台上,开发者可以提出问题、分享经验、探讨最佳实践,并得到其他开发者的帮助和解答。

TypeScript声明库(DefinitelyTyped):TypeScript声明库是一个由社区驱动的项目,用于为JavaScript库和API提供类型定义。通过使用这些类型定义,开发者能够在TypeScript中轻松地使用各种第三方库和工具,并获得类型检查和智能感知的好处。社区成员可以通过向DefinitelyTyped贡献类型定义来帮助增强TypeScript的生态系统。

第三方工具和插件:TypeScript社区中涌现出许多优秀的第三方工具和插件,如tslint、Prettier、TypeDoc等。这些工具可以帮助开发者进行代码风格检查、格式化、文档生成等工作,提高开发效率和代码质量。

开源项目:TypeScript也受到了许多开源项目的广泛支持和贡献。开发者可以为TypeScript本身或其他基于TypeScript的项目做出贡献,包括提交bug报告、修复问题、改进文档等,从而促进TypeScript社区的发展和壮大。

新功能的增加

  1. 空值合并运算符(Nullish Coalescing Operator):
    自TypeScript 3.7起,引入了空值合并运算符??,用于简化处理可能为null或undefined的值的情况。
  2. 可选链操作符(Optional Chaining Operator):
    自TypeScript 3.7起,添加了可选链操作符?.,用于简化访问嵌套对象属性或调用嵌套函数时的防御性编程。
  3. 类型断言的改进:
    TypeScript不断改进类型断言语法,在辨识度方面更灵活,可以使用尖括号形式或者as关键字进行类型断言。
  4. 固定长度元组类型(Fixed-length Tuple Types):
    自TypeScript 3.3起,支持了具有固定数量元素的元组类型。例如,可以定义类型为[string, number]的元组。
  5. 引入ES新特性的支持:
    TypeScript紧跟ECMAScript标准的变化,并在每个新发布的版本中添加对最新特性的支持。例如,TypeScript 4.0添加了对可选属性的短语法提案的支持。
  6. 错误消息的改进与清晰度提高:
    TypeScript不断改进编译器的错误消息,使得在代码出现错误时能够更准确地指示问题所在,并提供修复建议,帮助开发者快速定位和解决问题。

TypeScript在企业级项目中的应用

应用1: 企业级项目通常包含大量的代码,使用JavaScript开发容易出现难以察觉的错误。TypeScript的静态类型检查和强类型支持可以在编译时捕获潜在问题,提高代码质量和可维护性。
应用2: TypeScript的类型系统可以确保代码按预期方式运行,并提供更好的自文档化能力。这在多人合作开发和长期项目维护中尤为重要。
应用3: 企业级项目可能需要进行重构或重写。TypeScript提供了更好的重构支持,例如通过IDE的重命名、查找引用等功能,帮助开发人员快速而安全地进行代码改动。
应用4: TypeScript与主流的IDE(如Visual Studio Code)紧密集成,提供丰富的智能感知、代码补全和错误检查功能。这大大提高了开发效率和开发者体验。
应用5: TypeScript支持类、接口、模块等面向对象的编程范式,适用于大型企业项目的组织和架构。它也支持设计模式的实现,使得代码更易于理解、扩展和重用。
应用6: TypeScript具有广泛的第三方库支持,并提供类型定义文件(typings)以便在开发过程中获得良好的类型检查。这加速了企业级项目的开发进程,并提高了项目的质量和可靠性。
应用7: TypeScript拥有活跃的社区,始终保持着快速的迭代和更新速度。它不断引入新特性和改进,可以满足企业对新技术和工具的需求。
应用8: TypeScript可以用于开发多种平台的应用,包括Web、移动端和服务器端。它与JavaScript的兼容性使得企业能够更轻松地在不同平台间共享代码和逻辑。

在这里插入图片描述


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/21724.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

“百模大战”愈演愈烈,AI大模型的现状与发展

最近&#xff0c;随着 OpenAI 发布的以用户为中心的聊天机器人 ChatGPT 的发布&#xff0c;大型语言模型 (LLM) 引起了人们的关注。大模型的好坏与否&#xff0c;主要涉及三个方面&#xff1a;算法、算力和数据。算法决定了其本身的学习能力&#xff0c;算力则影响着算法的学习…

基于微信小程序的英语单词记忆系统的设计与实现(论文+源码)_kaic

摘 要 当前时期&#xff0c;国内的经济获得了非常快速的发展&#xff0c;互联网技术在持续的创新和完善&#xff0c;教育教学方面也在不断的进步&#xff0c;教育全面深化改革在发展&#xff0c;并且移动互联网技术在教育领域获得了大量的实践以及应用。语言的全球化慢慢的变…

golang macaron静态资源访问配置

1、本地文件目录如下&#xff1a; 2、macaron配置 package mainimport ("log""net/http""gopkg.in/macaron.v1" )func myHandler(ctx *macaron.Context) string {return "the request path is: " ctx.Req.RequestURI }func main() …

数据库约束与表的关系(数据库系列4)

目录 前言&#xff1a; 1.数据库的约束 1.1约束类型 1.1.1 not null 1.1.2 unique 唯一约束 1.1.3 default 默认值约束 1.1.4 primary key 主键约束 1.1.5 foreign key 外键约束 2.表的关系 2.1 一对一 2.2 一对多 2.3 多对一 3.新增 4.聚合查询 4.1聚合函数 4.…

Android屏幕适配方案

方案一&#xff1a; 安卓app禁止跟随系统字体大小&#xff0c;显示大小而改变。 1、定义工具类 public final class DisplayUtil {/*** 禁用7.0&#xff08;23&#xff09;以上显示大小改变和文字大小*/public static Resources disabledDisplayDpiChange(Resources res) {C…

MySQL在Centos 7环境安装

说明&#xff1a; 1.安装与卸载中&#xff0c;用户全部切换成为root&#xff0c;一旦安装&#xff0c;普通用户都能使用。 2.初期练习&#xff0c;mysql不进行用户管理&#xff0c;全部使用root进行&#xff0c;尽快适应mysql语句&#xff0c;后面学了用户管理&#xff0c;在考…

面试题更新之-hook中setState原理

文章目录 hook是什么&#xff1f;hook中setState原理 hook是什么&#xff1f; 在React中&#xff0c;Hook是一种用于在函数组件中添加状态和其他React特性的函数。它们被引入到React 16.8版本中&#xff0c;旨在解决使用类组件编写复杂逻辑时出现的一些问题。 使用Hook&#…

内 网 优 化

拓扑 需求 1&#xff09;所有部门中都使用了网关冗余技术&#xff0c;为了增强网关稳定性和冗余性 -配置VRRP -SW5是VLAN10和VLAN20的Master ,是VLAN30的Backup -SW6是VLAN10和VLAN20的Backup,是VLAN30的Master 2&#xff09;交换机之间存在很多冗余链路&#xff0c;必须防止环…

浅谈炼钢厂能源计量管理系统的设计与应用

安科瑞 华楠 摘要: 从能源计量和管理的角度&#xff0c;论述了炼钢厂的能源计量管理系统的基本组成及功能。该系统的建立&#xff0c;将使炼钢厂能源介质的计量管理工作实现自动采集、瞬时监测、故障报警、能流监视&#xff1b;完成报表统计、离线输入、成本分析、预测参考等功…

flutter开发实战-实现webview与Javascript通信JSBridge

flutter开发实战-实现webview与H5中Javascript通信JSBridge 在开发中&#xff0c;使用到webview&#xff0c;flutter实现webview是使用原生的插件实现&#xff0c;常用的有webview_flutter与flutter_inappwebview 这里使用的是webview_flutter&#xff0c;在iOS上&#xff0c;…

内容过多,超出部分以省略号“...”显示

效果图如图所示&#xff1a; 1.第一种实现方法&#xff0c;使用纯css实现&#xff08;ps&#xff1a;此方式必须给元素设置宽度&#xff0c;否则可能无效果&#xff09;&#xff0c;代码如下&#xff1a; html代码 <!-- 超过长度&#xff0c;用省略号实现&#xff0c;css的…

【ONE·Linux || 地址空间与进程控制(一)】

总言 进程地址空间和进程控制相关介绍。 文章目录 总言1、进程地址空间1.1、程序地址空间初识1.1.1、介绍程序地址空间划分及地址空间初步验证1.1.2、地址空间再次综述演示1.1.3、两个补充问题&#xff1a; 1.2、地址空间是什么1.2.1、阶段认识一&#xff1a;故事引入1.2.2、阶…