作者 |
弗拉德·里斯库迪亚 |
丛书名 |
华章程序员书库 |
出版社 |
机械工业出版社 |
ISBN |
9782101251632 |
简要 |
简介 |
内容简介书籍计算机书籍 ---------------------------编程与类型系统--------------------------- 本书全面介绍类型系统的特性,从基本类型开始,一直介绍到函数类型和子类型、OOP、泛型编程和高阶类型(如函子和单子)。本书没有关注这些特性背后的理论,而是通过实际应用的方式来解释每种特性。本书说明了如何以及何时使用每种特性来改进代码。 ---------------------------TypeScript项目开发实战--------------------------- 本书首先介绍常常被其他图书忽视的一些TypeScript功能,然后讲解如何创建一个简单的Markdown解析器。接着将介绍React,并创建一个客户端联系人管理器。之后,本书带领你认识Angular框架,并使用MEAN栈创建一个相册。本书接着将帮助你创建一个GraphQL Angular待办事项应用程序,并编写一个Socket.IO聊天室。本书开发的最后一个Angular项目是一个地图应用程序。之后回到React,介绍了如何使用Docker和微服务。紧接着,本书讲解了如何使用TensorFlow和机器学习来创建一个图像分类应用程序。最后,本书介绍了如何把TypeScript和C#结合起来,创建一个基于ASP.NET Core的音乐库应用程序。 |
目录 |
---------------------------编程与类型系统--------------------------- 前言 致谢 关于本书 类型及可能的取值 常用算法 第1章 类型简介1 1.1 为什么存在类型2 1.1.1 0和12 1.1.2 类型和类型系统的定义3 1.2 类型系统的优点4 1.2.1 正确性5 1.2.2 不可变性6 1.2.3 封装8 1.2.4 可组合性9 1.2.5 可读性11 1.3 类型系统的类型12 1.3.1 动态类型和静态类型12 1.3.2 弱类型与强类型13 1.3.3 类型推断15 小结15 第2章 基本类型17 2.1 设计不返回值的函数17 2.1.1 空类型18 2.1.2 单元类型20 2.1.3 习题21 2.2 布尔逻辑和短路21 2.2.1 布尔表达式22 2.2.2 短路计算22 2.2.3 习题24 2.3 数值类型的常见陷阱24 2.3.1 整数类型和溢出25 2.3.2 浮点类型和圆整28 2.3.3 任意大数30 2.3.4 习题31 2.4 编码文本31 2.4.1 拆分文本31 2.4.2 编码32 2.4.3 编码库34 2.4.4 习题36 2.5 使用数组和引用构建数据结构36 2.5.1 固定大小数组36 2.5.2 引用37 2.5.3 高效列表38 2.5.4 二叉树40 2.5.5 关联数组43 2.5.6 实现时的权衡44 2.5.7 习题44 小结44 习题答案45 第3章 组合46 3.1 复合类型47 3.1.1 元组47 3.1.2 赋予意义49 3.1.3 维护不变量50 3.1.4 习题53 3.2 使用类型表达多选一53 3.2.1 枚举53 3.2.2 可选类型55 3.2.3 结果或错误57 3.2.4 变体62 3.2.5 习题65 3.3 访问者模式65 3.3.1 简单实现66 3.3.2 使用访问者模式67 3.3.3 访问变体69 3.3.4 习题71 3.4 代数数据类型71 3.4.1 乘积类型71 3.4.2 和类型72 3.4.3 习题72 小结73 习题答案74 第4章 类型安全75 4.1 避免基本类型偏执来防止错误解释76 4.1.1 火星气候探测者号77 4.1.2 基本类型偏执反模式79 4.1.3 习题79 4.2 实施约束80 4.2.1 使用构造函数实施约束80 4.2.2 使用工厂实施约束81 4.2.3 习题82 4.3 添加类型信息82 4.3.1 类型转换82 4.3.2 在类型系统之外跟踪类型83 4.3.3 常见类型转换86 4.3.4 习题89 4.4 隐藏和恢复类型信息89 4.4.1 异构集合90 4.4.2 序列化92 4.4.3 习题95 小结96 习题答案96 第5章 函数类型98 5.1 一个简单的策略模式99 5.1.1 函数式策略100 5.1.2 函数的类型101 5.1.3 策略实现102 5.1.4 一等函数102 5.1.5 习题103 5.2 不使用switch语句的状态机103 5.2.1 类型编程小试牛刀104 5.2.2 状态机106 5.2.3 回顾状态机实现111 5.2.4 习题112 5.3 使用延迟值避免高开销的计算112 5.3.1 lambda113 5.3.2 习题115 5.4 使用map、filter和reduce115 5.4.1 map()115 5.4.2 filter()117 5.4.3 reduce()119 5.4.4 库支持122 5.4.5 习题123 5.5 函数式编程123 小结123 习题答案124 第6章 函数类型的高级应用126 6.1 一个简单的装饰器模式126 6.1.1 函数装饰器128 6.1.2 装饰器实现130 6.1.3 闭包130 6.1.4 习题131 6.2 实现一个计数器131 6.2.1 一个面向对象的计数器132 6.2.2 函数式计数器133 6.2.3 一个可恢复的计数器134 6.2.4 回顾计数器实现135 6.2.5 习题135 6.3 异步执行运行时间长的操作135 6.3.1 同步执行136 6.3.2 异步执行:回调136 6.3.3 异步执行模型137 6.3.4 回顾异步函数141 6.3.5 习题141 6.4 简化异步代码142 6.4.1 链接promise143 6.4.2 创建promise144 6.4.3 关于promise的更多信息146 6.4.4 async/await150 6.4.5 回顾整洁的异步代码152 6.4.6 习题152 小结153 习题答案153 第7章 子类型155 7.1 在TypeScript中区分相似的类型156 7.1.1 结构和名义子类型的优缺点158 7.1.2 在TypeScript中模拟名义子类型159 7.1.3 习题160 7.2 子类型的极端情况160 7.2.1 安全的反序列化160 7.2.2 错误情况的值164 7.2.3 回顾顶层和底层类型167 7.2.4 习题168 7.3 允许的替换168 7.3.1 子类型与和类型169 7.3.2 子类型和集合171 7.3.3 子类型和函数的返回类型172 7.3.4 子类型和函数实参类型174 7.3.5 回顾可变性178 7.3.6 习题178 小结179 习题答案179 第8章 面向对象编程的元素181 8.1 使用接口定义契约182 8.2 继承数据和行为185 8.2.1 “是一个”经验准则185 8.2.2 建模层次186 8.2.3 参数化表达式的行为187 8.2.4 习题188 8.3 组合数据和行为189 8.3.1 “有一个”经验准则189 8.3.2 复合类190 8.3.3 实现适配器模式192 8.3.4 习题194 8.4 扩展数据和行为194 8.4.1 使用组合扩展行为195 8.4.2 使用混入扩展行为197 8.4.3 TypeScript中的混入198 8.4.4 习题199 8.5 纯粹面向对象代码的替代方案199 8.5.1 和类型200 8.5.2 函数式编程202 8.5.3 泛型编程203 小结204 习题答案204 第9章 泛型数据结构206 9.1 解耦关注点207 9.1.1 可重用的恒等函数208 9.1.2 可选类型210 9.1.3 泛型类型211 9.1.4 习题211 9.2 泛型数据布局212 9.2.1 泛型数据结构212 9.2.2 什么是数据结构213 9.2.3 习题214 9.3 遍历数据结构214 9.3.1 使用迭代器216 9.3.2 流线化迭代代码220 9.3.3 回顾迭代器225 9.3.4 习题226 9.4 数据流226 9.4.1 处理管道227 9.4.2 习题228 小结228 习题答案229 第10章 泛型算法和迭代器232 10.1 更好的map()、filter()和reduce()233 10.1.1 map()233 10.1.2 filter()234 10.1.3 reduce()234 10.1.4 filter()/reduce()管道235 10.1.5 习题236 10.2 常用算法236 10.2.1 使用算法代替循环237 10.2.2 实现流畅管道237 10.2.3 习题241 10.3 约束类型参数241 10.3.1 具有类型约束的泛型数据结构242 10.3.2 具有类型约束的泛型算法243 10.3.3 习题245 10.4 高效reverse和其他使用迭代器的算法245 10.4.1 迭代器的基础模块247 10.4.2 有用的find()251 10.4.3 高效的reverse()254 10.4.4 高效地获取元素257 10.4.5 回顾迭代器259 10.4.6 习题260 10.5 自适应算法260 小结262 习题答案263 第11章 高阶类型及其他266 11.1 更加通用的map267 11.1.1 处理结果或传播错误270 11.1.2 混搭函数的应用272 11.1.3 函子和高阶类型273 11.1.4 函数的函子276 11.1.5 习题277 11.2 单子277 11.2.1 结果或错误277 11.2.2 map()与bind()的区别282 11.2.3 单子模式284 11.2.4 continuation单子285 11.2.5 列表单子286 11.2.6 其他单子288 11.2.7 习题288 11.3 继续学习289 11.3.1 函数式编程289 11.3.2 泛型编程289 11.3.3 高阶类型和范畴论289 11.3.4 从属类型290 11.3.5 线性类型290 小结290 习题答案291 附录A TypeScript的安装及本书的源代码293 附录B TypeScript速览表295 ---------------------------TypeScript项目开发实战--------------------------- 前言 审校者简介 第1章 TypeScript的高级特性 1 1.1 技术需求 2 1.2 使用tsconfig构建面向未来的TypeScript 2 1.3 TypeScript高级特性简介 3 1.3.1 借助联合类型使用不同的类型 3 1.3.2 使用交叉类型组合类型 5 1.3.3 使用类型别名简化类型声明 7 1.3.4 使用对象展开赋值属性 8 1.3.5 使用REST属性解构对象 10 1.3.6 使用REST处理可变数量的参数11 1.3.7 使用装饰器进行AOP 13 1.3.8 使用混入(mixin)组成类型 17 1.3.9 使用泛型,将相同的代码用于不同的类型20 1.3.10 使用映射来映射值24 1.3.11 使用Promise和async/await创建异步代码25 1.3.12 使用Bootstrap创建UI27 1.4 小结 30 习题 31 第2章 使用TypeScript创建一个markdown编辑器 32 2.1 技术需求33 2.2 项目概述33 2.3 开始创建一个简单的HTML项目34 2.4 编写一个简单的markdown解析器34 2.4.1 创建Bootstrap UI 35 2.4.2 将markdown标签类型映射到HTML标签类型38 2.4.3 使用MarkdownDocument类表示转换后的markdown标记 41 2.4.4 使用访问者更新markdown文档 42 2.4.5 通过使用责任链模式决定应用哪个标签 44 2.4.6 综合运用 48 2.5 小结 49 延伸阅读50 第3章 React Bootstrap联系人管理器 51 3.1 技术需求 51 3.2 项目概述 52 3.3 开始使用组件 52 3.4 创建一个支持TypeScript的React Bootstrap项目 53 3.5 创建模拟布局 53 3.5.1 创建应用程序 54 3.5.2 使用tslint设置代码的格式 55 3.5.3 添加Bootstrap支持 56 3.6 在React中使用tsx组件 57 3.6.1 React如何使用虚拟DOM来提高响应性 57 3.6.2 React应用程序的组件 58 3.7 显示个人信息界面59 3.8 验证用户输入及验证器的使用 65 3.8.1 验证地址66 3.8.2 验证姓名68 3.8.3 验证电话号码68 3.9 在React组件中应用验证70 3.10 创建数据并把数据发送给IndexedDB数据库71 3.10.1 在状态中添加对记录状态的支持 74 3.10.2 从PersonalDetails访问数据库79 3.11 增强代码83 3.12 小结83 习题84 延伸阅读84 第4章 MEAN栈——构建一个相册 85 4.1 技术需求86 4.2 MEAN栈86 4.3 项目概述87 4.4 准备工作88 4.5 使用MEAN栈创建Angular相册 88 4.5.1 Angular简介 88 4.5.2 创建应用程序 90 4.5.3 使用Angular Material创建UI 91 4.5.4 使用Material添加导航 92 4.5.5 创建第一个组件——FileUpload组件 94 4.5.6 在应用程序中引入对Express的支持100 4.5.7 提供路由支持 102 4.5.8 显示图片107 4.5.9 显示对话框114 4.6 小结 115 习题 116 延伸阅读 116 第5章 使用GraphQL和Apollo创建Angular待办事项应用程序 117 5.1 技术需求118 5.2 理解GraphQL与REST的关系118 5.3 项目概述119 5.4 准备工作120 5.5 使用GraphQL和Angular创建待办事项应用程序120 5.5.1 创建应用程序121 5.5.2 创建GraphQL架构 126 5.5.3 创建GraphQL解析器 129 5.5.4 使用Apollo Server作为服务器 133 5.5.5 GraphQL Angular客户端 135 5.5.6 向页面组件添加内容 139 5.6 小结 149 习题 150 延伸阅读150 第6章 使用Socket.IO构建一个聊天室应用程序 151 6.1 技术需求152 6.2 使用Socket.IO建立客户端/服务器之间的长时间通信 152 6.3 项目概述152 6.4 开始使用Socket.IO和Angular 153 6.5 使用Socket.IO、Angular和Auth0创建一个聊天室应用程序155 6.5.1 创建应用程序 156 6.5.2 为服务器添加Socket.IO支持 158 6.5.3 创建聊天室客户端 160 6.5.4 使用Auth0授权和验证用户 162 6.5.5 使用安全路由165 6.5.6 添加客户端聊天功能166 6.5.7 使用GeneralchatComponent完成我们的应用程序170 6.6 小结172 习题172 延伸阅读172 第7章 使用必应地图和Firebase创建基于云的Angular地图应用程序 173 7.1 技术需求174 7.2 现代应用程序及使用云服务的趋势 174 7.3 项目概述174 7.4 在Angular中使用必应地图175 7.4.1 注册必应地图 176 7.4.2 注册Firebase 178 7.5 使用Angular和Firebase创建必应地图应用程序181 7.5.1 添加地图组件181 7.5.2 兴趣点182 7.5.3 表示地图图钉184 7.5.4 使用地图搜索做一些有趣的操作 186 7.5.5 将必应地图添加到屏幕上188 7.5.6 地图事件和图钉的设置190 7.5.7 保护数据库194 7.6 小结195 习题196 第8章 使用React和微服务来构建一个CRM 197 8.1 技术需求197 8.2 理解Docker和微服务198 8.2.1 Docker术语 198 8.2.2 微服务 199 8.2.3 使用Swagger设计REST API 200 8.3 使用Docker创建一个微服务应用程序 203 8.3.1 开始使用Docker创建一个微服务应用程序 204 8.3.2 添加服务器端路由支持 209 8.3.3 使用Docker运行服务 212 8.3.4 创建React UI 215 8.3.5 添加导航 223 8.4 小结 224 习题 225 延伸阅读 225 第9章 使用Vue.js和TensorFlow.js进行图像识别 226 9.1 技术需求226 9.2 机器学习及TensorFlow简介227 9.2.1 什么是机器学习228 9.2.2 TensorFlow及其与机器学习的关系228 9.3 项目概述229 9.4 开始在Vue中使用TensorFlow 229 9.4.1 创建基于Vue的应用程序230 9.4.2 使用Vue模板显示主页232 9.4.3 修改HelloWorld组件来支持图像分类236 9.4.4 Vue应用程序的入口点 239 9.4.5 添加姿势检测功能243 9.4.6 完成姿势检测组件250 9.5 小结 253 习题254 延伸阅读254 第10章 构建ASP.NET Core音乐库255 10.1 技术需求255 10.2 ASP.NET Core MVC简介256 10.3 项目概述258 10.4 开始使用ASP.NET Core、C#和TypeScript创建一个音乐库259 10.4.1 使用Visual Studio创建ASP.NET Core应用程序260 10.4.2 理解应用程序结构263 10.4.3 创建一个Discogs模型269 10.4.4 关联控制器275 10.4.5 添加Index视图276 10.4.6 向应用程序添加TypeScript 279 10.4.7 从ASP.NET调用TypeScript功能 283 10.5 小结 285 习题 285 延伸阅读 285 习题答案 287 |