TypeScript总结:19、综合案例
TypeScript 综合案例任务管理器本文通过一个简单的任务管理器案例把前面学习的枚举、接口、类、封装、泛型和严格类型检查串联起来。一、案例目标实现以下功能创建任务。查询任务。完成任务。保存任务列表。使用泛型编写通用仓库。使用接口约束数据结构。使用类封装业务逻辑。二、项目结构为了方便学习先把代码写在一个文件中ts-task/ ├── src/ │ └── index.ts ├── dist/ ├── package.json └── tsconfig.json实际项目中可以进一步拆分为src/ ├── models/ │ └── task.ts ├── repositories/ │ └── memory-repository.ts ├── services/ │ └── task-service.ts └── index.ts三、定义任务状态任务状态是有限的几个固定值适合使用字符串枚举enumTaskStatus{Todotodo,Doingdoing,Donedone}使用枚举后任务状态不会被随意写成任意字符串conststatus:TaskStatusTaskStatus.Todo;四、定义任务接口接口用于描述任务对象的结构interfaceTask{readonlyid:number;title:string;status:TaskStatus;}id是任务唯一标识创建后不应该被修改所以使用readonly。五、定义泛型仓库接口不同业务可能需要保存不同类型的数据因此仓库可以使用泛型interfaceRepositoryTextends{readonlyid:number}{add(item:T):void;getById(id:number):T|undefined;list():T[];}这里的泛型约束表示传入仓库的数据必须具有只读的id数字属性。六、实现内存仓库使用类实现仓库接口classMemoryRepositoryTextends{readonlyid:number}implementsRepositoryT{privateitems:T[][];add(item:T):void{this.items.push(item);}getById(id:number):T|undefined{returnthis.items.find((item)item.idid);}list():T[]{return[...this.items];}}这里体现了几个知识点private外部不能直接修改内部数组。泛型T仓库可以保存不同类型的数据。implements类必须实现接口中声明的方法。T | undefined查询不到数据时明确表示可能没有结果。七、封装任务服务任务服务负责处理任务相关业务classTaskService{constructor(privatereadonlyrepository:RepositoryTask){}create(title:string):Task{consttask:Task{id:Date.now(),title,status:TaskStatus.Todo};this.repository.add(task);returntask;}complete(id:number):boolean{consttaskthis.repository.getById(id);if(!task){returnfalse;}task.statusTaskStatus.Done;returntrue;}list():Task[]{returnthis.repository.list();}}TaskService不需要知道任务具体保存在哪里它只依赖RepositoryTask接口。这种设计方便以后把内存仓库替换成数据库仓库或接口仓库。八、运行案例constrepositorynewMemoryRepositoryTask();consttaskServicenewTaskService(repository);consttasktaskService.create(学习 TypeScript);console.log(创建任务,task);taskService.complete(task.id);console.log(任务列表,taskService.list());预期结果类似创建任务 { id: 1690000000000, title: 学习 TypeScript, status: todo } 任务列表 [ { id: 1690000000000, title: 学习 TypeScript, status: done } ]Date.now()的具体值会根据运行时间变化上面的数字只是示例。九、处理未知输入如果任务状态来自用户输入或网络请求不能直接断言为TaskStatus应该先校验functionisTaskStatus(value:unknown):valueisTaskStatus{return(valueTaskStatus.Todo||valueTaskStatus.Doing||valueTaskStatus.Done);}functionparseTaskStatus(value:unknown):TaskStatus{if(isTaskStatus(value)){returnvalue;}returnTaskStatus.Todo;}这里使用了unknown表示外部传入的数据类型未知。类型谓词value is TaskStatus告诉编译器检查成功后值就是任务状态。默认值输入不合法时回退到Todo。十、完整 index.ts下面的代码可以直接保存为src/index.tsenumTaskStatus{Todotodo,Doingdoing,Donedone}interfaceTask{readonlyid:number;title:string;status:TaskStatus;}interfaceRepositoryTextends{readonlyid:number}{add(item:T):void;getById(id:number):T|undefined;list():T[];}classMemoryRepositoryTextends{readonlyid:number}implementsRepositoryT{privateitems:T[][];add(item:T):void{this.items.push(item);}getById(id:number):T|undefined{returnthis.items.find((item)item.idid);}list():T[]{return[...this.items];}}classTaskService{constructor(privatereadonlyrepository:RepositoryTask){}create(title:string):Task{consttask:Task{id:Date.now(),title,status:TaskStatus.Todo};this.repository.add(task);returntask;}complete(id:number):boolean{consttaskthis.repository.getById(id);if(!task){returnfalse;}task.statusTaskStatus.Done;returntrue;}list():Task[]{returnthis.repository.list();}}constrepositorynewMemoryRepositoryTask();consttaskServicenewTaskService(repository);consttasktaskService.create(学习 TypeScript);console.log(创建任务,task);taskService.complete(task.id);console.log(任务列表,taskService.list());十一、配置 tsconfig.json{compilerOptions:{target:ES2015,module:CommonJS,rootDir:src,outDir:dist,strict:true,noEmitOnError:true},include:[src/**/*.ts],exclude:[node_modules,dist]}十二、运行项目初始化项目并安装 TypeScriptnpminit-ynpminstall--save-dev typescript编译npx tsc运行编译结果nodedist/index.js也可以在package.json中添加{scripts:{build:tsc,start:node dist/index.js,type-check:tsc --noEmit}}十三、案例中的知识点对应关系知识点案例中的使用位置枚举TaskStatus接口Task、RepositoryTreadonly任务id类MemoryRepository、TaskServiceprivate仓库内部的items泛型RepositoryT和MemoryRepositoryT泛型约束T extends { readonly id: number }unknown外部任务状态校验严格检查strict: true十四、可以继续扩展的功能在这个案例上可以继续添加删除任务。修改任务标题。按状态筛选任务。使用抽象类定义不同类型的仓库。使用 Webpack 打包项目。把内存仓库替换成数据库或 HTTP API。为任务服务增加单元测试。十五、本章小结接口负责描述结构。枚举负责约束有限状态。类负责封装数据和业务行为。泛型负责编写可复用的类型安全仓库。unknown和类型谓词负责处理外部不可信输入。tsconfig.json负责统一项目编译配置。

相关新闻

ComfyUI-VideoHelperSuite:让图像序列一键变成视频的完整指南

ComfyUI-VideoHelperSuite:让图像序列一键变成视频的完整指南

ComfyUI-VideoHelperSuite:让图像序列一键变成视频的完整指南 【免费下载链接】ComfyUI-VideoHelperSuite Nodes related to video workflows 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI-VideoHelperSuite 这篇文章写给所有被"图像序列转视频…

2026/10/16 21:49:17 阅读更多 →
猴痘病毒抗原MPV-Ag检测试剂说明书分享

猴痘病毒抗原MPV-Ag检测试剂说明书分享

猴痘病毒是正痘病毒属的人兽共患病原体,可通过密切接触在人与动物、人际间传播。通用名称:猴痘病毒抗原(MPV-Ag)检测试剂(胶体金法)【包装规格】1T / 独立铝箔袋;10 T/ 整盒【预期用途】本试剂仅…

2026/10/7 4:12:54 阅读更多 →
从0到1:用微信辅助功能实现自动抢红包的避坑指南

从0到1:用微信辅助功能实现自动抢红包的避坑指南

从0到1:用微信辅助功能实现自动抢红包的避坑指南 【免费下载链接】WeChatLuckyMoney :money_with_wings: WeChats lucky money helper (微信抢红包插件) by Zhongyi Tong. An Android app that helps you snatch red packets in WeChat groups. 项目地址: https:…

2026/10/14 11:50:53 阅读更多 →

最新新闻

Java泛型从入门到原理:类型擦除、通配符与实战避坑指南

Java泛型从入门到原理:类型擦除、通配符与实战避坑指南

如果你写过几年 Java,一定在某个深夜被ClassCastException支配过——那一行异常信息只告诉你哪里转失败了,就是不告诉你到底传进来的是什么。泛型就是解决这个问题的,它把本该在运行期爆发的类型问题,直接摁死在编译期。这篇就围绕…

2026/10/17 13:50:48 阅读更多 →
QT原生日志持久化方案:可配置、轮转、条件过滤的生产级实现

QT原生日志持久化方案:可配置、轮转、条件过滤的生产级实现

简介:本资源是一套基于Qt框架实现的日志管理完整源码方案,面向C桌面应用开发者,尤其适合需要在跨平台GUI项目中集成轻量级、可配置日志功能的中级程序员。它解决了Qt原生不提供滚动日志机制的痛点,支持按文件大小自动切分、时间戳…

2026/10/17 13:50:48 阅读更多 →
多媒体实验全流程:从环境搭建到特征提取与结果评测

多媒体实验全流程:从环境搭建到特征提取与结果评测

简介:面向高校“多媒体技术及应用”课程学生与Authorware初学者的实验报告资源。该报告以“文字的滚动效果”为主题,系统演示了显示、等待、运动、擦除四大图标在交互作品中的协同用法,涵盖背景导入、文字编辑、移动路径调整、擦除特效设置&a…

2026/10/17 13:50:48 阅读更多 →
[SWPUCTF 2023 秋季新生赛]Easy SMC

[SWPUCTF 2023 秋季新生赛]Easy SMC

将下述文件拉到kali命令行执行我的kali是64,所以选linux_server根据IP和端口填远程调试在此处打断点、 按F7进入GetNextNumber函数按U取消定义选中0000555555555527到00005555555557B6,此处有retn按c强制转换为代码按p转换为函数按f5查看伪函数exp impor…

2026/10/17 13:50:48 阅读更多 →
2026大平层装修高定木作品牌哪家好:口碑、优缺点与选购避坑

2026大平层装修高定木作品牌哪家好:口碑、优缺点与选购避坑

在大平层和高端大宅装修中,高定木作不仅是收纳与功能的载体,更是决定空间风格调性与生活品质的核心要素。2026年,国内高定木作市场品牌林立,不同品牌在工艺、材质、风格、价格和服务上差异显著,面对琳琅满目的选择&…

2026/10/17 13:50:48 阅读更多 →
ASP.NET WebForms 入门实战:30分钟跑通登录页

ASP.NET WebForms 入门实战:30分钟跑通登录页

简介:本资源是面向零基础初学者的《ASP.Net入门经典》系统性学习包,聚焦Web开发核心技能培养,帮助开发者快速掌握ASP.Net Web Forms、MVC架构、Razor语法、页面生命周期、数据绑定及IIS部署等关键能力,适用于高校计算机专业学生、…

2026/10/17 13:49:47 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/16 21:35:51 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/17 1:44:59 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 21:54:38 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →