typescript实战Todos-demo:对typescript的入门解析

44 阅读5分钟

一、引言:为什么 TypeScript 是前端开发的 “最优解” 之一

TypeScript 是什么?

TypeScript(简称 TS)是由微软开发的、JavaScript(简称 JS)的超集。简单来说,它就是给原本 “无拘无束” 的 JavaScript 加上了静态类型系统,最终会被编译成普通的 JavaScript 代码运行。

你可以把 JS 想象成没有交通规则的马路,代码怎么写都能跑,但容易出 “事故”(比如变量类型错误、参数传错);而 TS 就像给马路加上了交通规则,写代码时就会提前提醒你哪里违规,避免运行时才出问题。

1.1 JavaScript 的痛点与 TypeScript 的诞生

  • JavaScript 弱类型特性带来的开发问题(如类型隐式转换、运行时错误、重构风险)
  • TypeScript 作为 JavaScript 超集的核心定位:强类型、静态检查的补充价值

1.2 TypeScript 核心优势(结合开发场景)

  • 静态类型约束:提前规避类型相关 bug,降低线上故障概率
  • 编译时类型检查:边写边校验,减少调试成本
  • 增强的开发体验:智能代码提示、便捷的文档查看、未使用变量 / 代码的垃圾提示
  • 重构友好性:修改多人协作代码时的安全性与效率提升

1.3 实战 Todos 项目的意义

  • Todos 项目的典型性:覆盖前端核心场景(状态管理、组件通信、本地存储、DOM 交互)
  • 以 Todos 项目为载体,落地 TypeScript 核心语法与最佳实践

二、前置准备:TypeScript 环境搭建与基础认知

2.1 TypeScript 安装与编译配置

  • 全局安装 TypeScript:npm install -g typescript
  • 基础编译命令(tsc)与 tsconfig.json 核心配置(如目标版本、模块系统、严格模式)

2.2 TypeScript 核心基础语法回顾(为 Todos 项目铺垫)

  • 基础类型:number/string/boolean/null/undefined/ 数组 / 元组

image.png

  • 高级类型:枚举(enum)、联合类型(|)、自定义类型(type)、未知类型(unknown)、任意类型(any)

image.png

image.png image.png

  • 接口(interface):对象结构约束、只读属性、可选属性

image.png

  • 泛型:类型传参思想(为本地存储工具函数打基础)

image.png

三、Todos 项目架构设计:TypeScript 视角下的模块化拆分

3.1 项目核心需求梳理

  • 功能清单:添加待办、切换待办完成状态、删除待办、本地存储持久化
  • 数据模型:Todo 接口定义(id/title/completed),明确核心数据结构

3.2 模块化拆分原则(TypeScript 类型约束贯穿)

  • 类型层(types/todo.ts):统一 Todo 接口,约束全项目数据格式
  • 组件层:TodoInput(输入添加)、TodoItem(单条待办)、TodoList(待办列表),组件 Props 接口约束
  • 工具层(utils/storages.ts):泛型封装 localStorage 读写函数,保证数据类型安全
  • 逻辑层(hooks/useTodos.ts):自定义 Hook 封装待办状态管理逻辑

image.png

四、Todos 项目实战:TypeScript 全流程落地

4.1 核心类型定义:Todo 接口设计

  • 接口约束的必要性:确保全项目待办数据结构一致性
  • 代码实现: image.png

4.2 工具函数封装:泛型实现本地存储

  • 问题背景:localStorage 默认存储字符串,需处理类型转换
  • 泛型函数设计:getStorage/setStorage,支持任意类型的安全读写
  • TypeScript 优势体现:类型参数约束,避免存储 / 读取时的类型不匹配

image.png

4.3 组件开发:TypeScript 约束组件 Props 与状态

4.3.1 TodoInput 组件:输入与添加逻辑

  • Props 接口定义:onAdd: (title: string) => void,约束父组件传参类型
  • 状态类型约束:useState<string>(''),限定输入值为字符串类型
  • 核心逻辑:非空校验、触发添加回调、清空输入框
  • 引入React.FC(全称 React.FunctionComponent)是 React 为函数式组件提供的核心类型,用于约束函数组件的类型定义,结合 TypeScript 的静态类型检查,能大幅提升组件开发的规范性和安全性。FC是一个泛型类型 image.png

4.3.2 TodoItem 组件:单条待办渲染与操作

  • Props 接口:接收 Todo 对象、toggle/remove 回调,明确参数类型
  • 交互逻辑:复选框状态绑定、完成态样式控制、删除按钮触发

image.png

4.3.3 TodoList 组件:待办列表渲染

  • Props 接口:接收 Todo 数组、转发 toggle/remove 回调
  • 列表渲染:map 遍历 + key 唯一性,TypeScript 约束遍历项类型

image.png

4.4 状态管理:自定义 Hook(useTodos)封装核心逻辑

  • 初始状态:结合 localStorage,泛型获取初始待办列表

image.png

  • 核心方法类型约束:

    • addTodo:接收 string 类型 title,生成新 Todo 对象 image.png
    • toggleTodo:接收 number 类型 id,切换完成状态、

image.png - removeTodo:接收 number 类型 id,过滤待办列表

image.png

  • 副作用处理:useEffect 监听 todos 变化,自动持久化到本地存储

image.png

五、TypeScript 在 Todos 项目中的价值体现

5.1 开发阶段:提前规避错误

  • 类型不匹配即时提示(如给 Todo 的 id 传字符串、回调函数参数类型错误)
  • 未使用变量 / 函数的垃圾代码提示,保持代码整洁

5.2 协作阶段:提升代码可读性与维护性

  • 接口 / 类型定义即文档,无需额外注释即可明确数据结构
  • 重构安全:修改 Todo 接口或回调参数类型时,全项目关联处即时报错

5.3 运行阶段:降低线上 bug 概率

  • 编译时过滤大部分类型相关错误,避免运行时因类型问题崩溃

六、进阶拓展:Todos 项目的 TypeScript 优化方向

6.1 严格模式配置(strict: true)

  • 开启严格类型检查,进一步提升代码健壮性
  • 处理严格模式下的类型兼容问题(如 null/undefined 处理)

6.2 类型复用与扩展

  • 提取通用类型(如回调函数类型),减少重复定义
  • 接口继承:扩展 Todo 接口支持更多属性(如创建时间、分类)

6.3 结合 TypeScript 工具类型

  • 使用 Partial/Pick 等工具类型优化状态更新逻辑
  • 示例:Partial<Todo>实现待办项部分更新

七、总结:TypeScript 实战落地的核心思路

7.1 核心原则:类型先行

  • 先定义接口 / 类型,再实现逻辑,让类型约束贯穿开发全流程

7.2 Todos 项目的核心收获

  • 掌握 TypeScript 基础语法与高级特性的实战应用
  • 理解前端组件化 + 状态管理中 TypeScript 的最佳实践

7.3 延伸思考:TypeScript 在大型项目中的落地路径

  • 从核心模块入手,逐步覆盖全项目
  • 结合 ESLint/Prettier,规范 TypeScript 代码风格