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/8/16 12:51:51 阅读更多 →
猴痘病毒抗原MPV-Ag检测试剂说明书分享

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

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

2026/8/15 10:00:31 阅读更多 →
从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/8/15 10:00:31 阅读更多 →

最新新闻

曲率感知零阶优化:实现内存高效的测试时模型自适应

曲率感知零阶优化:实现内存高效的测试时模型自适应

这次我们来看一个在机器学习模型部署和优化领域非常实用的技术: Curvature-Aware Zeroth-Order Optimization for Memory-Efficient Test-Time Adaptation 。简单来说,这是一个专门为“测试时适应”场景设计的、内存高效的零阶优化算法。它的核心目标很…

2026/8/16 12:52:38 阅读更多 →
自定义注解实现百度统计埋点

自定义注解实现百度统计埋点

1. 自定义注解与拦截器实现 首先,定义一个用于标记需要统计的方法或接口的自定义注解 BaiduStatistics。 import java.lang.annotation.*;/*** 百度统计自定义注解* 用于标记需要进行访问统计的方法或接口*/ Target({ElementType.METHOD, ElementType.TYPE}) Rete…

2026/8/16 12:52:38 阅读更多 →
SpringBoot事务优化:非数据库逻辑移出事务

SpringBoot事务优化:非数据库逻辑移出事务

SpringBoot事务优化:非数据库逻辑移出事务用途:代码CR、AI评审、团队编码参考 核心主题:Transactional大事务优化,晚开事务、早提交事务,区分哪些逻辑放事务内、哪些放事务外,附带正反案例、坑点、两种业务…

2026/8/16 12:52:38 阅读更多 →
网络安全核心维度与防护实战指南

网络安全核心维度与防护实战指南

1. 网络安全:数字时代的生存必修课 早上七点,你睡眼惺忪地抓起手机刷社交媒体;九点在地铁上用电子钱包买早餐;下午通过云文档与同事协作方案;晚上回家用智能门锁开门,对着语音助手点外卖——这些稀松平常的…

2026/8/16 12:52:38 阅读更多 →
Windows IIS FTP服务器搭建与多用户权限隔离配置实战

Windows IIS FTP服务器搭建与多用户权限隔离配置实战

1. 项目概述:为什么要在Windows上自建FTP服务器? 在项目协作、文件共享或者个人数据备份的场景里,我们经常需要一种简单可靠的方式来传输文件。虽然现在有各种云盘和即时通讯工具,但在局域网内,或者对传输速度、可控性…

2026/8/16 12:52:37 阅读更多 →
OpenClaw集成Cloudflare AI Gateway:构建稳定可控的AI智能体调用链路

OpenClaw集成Cloudflare AI Gateway:构建稳定可控的AI智能体调用链路

1. 项目概述:为什么要把OpenClaw和Cloudflare AI Gateway绑在一起? 如果你最近在折腾本地AI智能体,尤其是OpenClaw这个项目,那你大概率已经体验过它的强大和……偶尔的“调皮”。OpenClaw,这个被社区戏称为“小龙虾”的…

2026/8/16 12:51:37 阅读更多 →

日新闻

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

如果你是一名开发者,最近可能已经感受到了AI大模型正在从“玩具”变成“生产力工具”的强烈信号。从代码补全到智能Agent,从本地部署到云端API,我们正处在一个技术栈快速重构的节点。然而,面对层出不穷的模型、框架和工具&#xf…

2026/8/16 0:00:54 阅读更多 →
工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/16 0:00:55 阅读更多 →
【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

2026/8/16 0:03:55 阅读更多 →

周新闻

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

如果你是一名开发者,最近可能已经感受到了AI大模型正在从“玩具”变成“生产力工具”的强烈信号。从代码补全到智能Agent,从本地部署到云端API,我们正处在一个技术栈快速重构的节点。然而,面对层出不穷的模型、框架和工具&#xf…

2026/8/16 0:00:54 阅读更多 →
工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/16 0:00:55 阅读更多 →
【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

2026/8/16 0:03:55 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/16 6:00:23 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/16 6:00:24 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/16 6:00:27 阅读更多 →