TypeScript 的学习资料非常多,其中也不乏很多优秀的文章和教程。但是目前为止没有一个我特别满意的。原因有:

  • 它们大多数没有一个清晰的主线,而是按照 API 组织章节的,内容在**逻辑上**比较零散。
  • 大多是“讲是什么,怎么用“,而不是”讲为什么,讲原理“。
  • 大多数内容比较枯燥,趣味性比较低。都是干巴巴的文字,没有图片,缺乏能够引起强烈共鸣的例子。

因此我的想法是做一套不同市面上大多数的 TypeScript 学习教程。以人类认知的角度思考问题,学习 TypeScript,通过通俗易懂的例子和图片来帮助大家建立 TypeScript 世界观。

系列安排:

  • 上帝视角看 TypeScript(已发布)
  • TypeScript 类型系统(已发布)
  • types 和 @types 是什么?(就是本文)
  • 你不知道的 TypeScript 泛型(万字长文,建议收藏)(已发布)
  • TypeScript 配置文件该怎么写?
  • TypeScript 是如何与 React,Vue,Webpack 集成的?
  • TypeScript 练习题

❝ 目录将来可能会有所调整。

注意,我的系列文章基本不会讲 API,因此需要你有一定的 TypeScript 使用基础,推荐两个学习资料。

  • 深入理解 TypeScript
  • 官方文档

结合这两个资料和我的系列教程,掌握 TypeScript 指日可待。

接下来,我们通过几个方面来从宏观的角度来看一下 TypeScript。

前言

  • 作者:feiker & Lucifer

TypeScript 中有几个概念和名字很像,会让初学者傻傻分不清楚。比如配置文件中的 types 和 typeRoots,并且还有一个 @types。接触过 TypeScript 的人一定接触过它们, 这几个有什么区别和联系呢?今天就带你来重新认识下它们。

一个例子

这里我通过一个例子来说明一下什么是 @types,这样大家理解起来更深刻一点。

当我们用 npm 等包管理工具安装第三方包的时候,有些包并不是 TypeScript 编写的,自然也不会导出 TypeScript 声明文件。这种情况下,如果我们在 TypeScript 项目中引入了这种包,则会编译报错(没有设置 allowJS)。举个例子,当我们通过npm install jquery --save 安装 jquery 包并引用的时候,TypeScript 会报错。

❝ allowJS 是 TypeScript 1.8 引进的一个编译项。

报错内容如下:

❝ Could not find a declaration file for module ‘jquery’. Try npm install @types/jquery if it exists or add a new declaration (.d.ts) file containing declare module 'jquery';

这里的意思是 TypeScript 没有找到 jquery 这个包的定义,你可以通过npm install @types/jquery安装相关声明,或者自己定义一份.d.ts 文件,并将 jquery 声明为 module。

全世界不是 TypeScript 编写的包多了去了。即使你的包是 TypeScript 编写的,如果你没有导出声明文件,也是没用的。(TypeScript 默认不会导出声明文件,只会编译输出 JavaScript 文件)。因此 TypeScript 必须对这种情况提供解决方案,而上面的两种方案(安装 @types 和 自己 declare module)就是 TypeScript 官方提出的, 你可以选择适合你的方案。我的推荐是尽量使用 @types 下的声明,实在没有,再使用第二种方法。

值得一提的是,并不是所有的包都可以通过这种方式解决的, 能解决的是 DefinitelyTyped 组织已经写好定义的包, 好消息是比较流行的包基本都有。 如果你想查一个包是否在 @type 下,可以访问 https://microsoft.github.io/TypeSearch/

那么 TypeScript 是怎么找定义的,什么情况会找不到定义而报类似上面举的例子的错误,这里简单介绍下原理。

包类型定义的查找

就好像 node 的包查找是先在当前文件夹找 node_modules,在它下找递归找,如果找不到则往上层目录继续找,直到顶部一样, TypeScript 类型查找也是类似的方式。

具体来说就是:

  • TypeScript 编译器先在当前编译上下文找 jquery 的定义。
  • 如果找不到,则会去 node_modules 中的@types (默认情况,目录可以修改,后面会提到)目录下去寻找对应包名的模块声明文件。

@types/*模块声明文件由社区维护,通过发布到@types 空间下。 GitHub - DefinitelyTyped/DefinitelyTyped: The repository for high quality TypeScript type definitions.

变量类型定义的查找

和包查找类似,默认情况下变量类型定义的查找也会去 @types 下去寻找。只不过并不是直接去 @types 找,而是有一定的优先级, 这个过程类似原型链或者作用域链。

比如如下代码:

const user: User = { name: "lucifer" };

  • Typescript 则会先在本模块查找 User 的定义。
  • 如果找到,则直接返回。 如果找不到, 则会到全局作用域找,而这个全局默认就是指的就是 @types 下的所有类型定义。(注意目录页是可以配的)

❝ 也就是说 @types 下的定义都是全局的。当然你可以导入 @types 下导出的定义,使得它们的作用域变成你的模块内部。

typeRoots 与 types

前面说了 TypeScript 会默认引入node_modules下的所有@types声明,但是开发者也可以通过修改tsconfig.json的配置来修改默认的行为.

tsconfig.json 中有两个配置和类型引入有关。

  1. typeRoots: 用来指定默认的类型声明文件查找路径,默认为node_modules/@types, 指定typeRoots后,TypeScript 编译器会从指定的路径去引入声明文件,而不是node_modules/@types, 比如以下配置会从typings路径下去搜索声明
{"compilerOptions": {"typeRoots": ["./typings"]}
}

  1. types: TypeScript 编译器会默认引入typeRoot下所有的声明文件,但是有时候我们并**不希望全局引入所有定义**,而是仅引入部分模块。这种情景下可以通过types指定模块名只引入我们想要的模块,比如以下只会引入 jquery 的声明文件
{"compilerOptions": {"types": ["jquery"]}
}

总结

  1. typeRoots 是 tsconfig 中 compilerOptions 的一个配置项,typeRoots 下面的包会被 ts 编译器自动包含进来,typeRoots 默认指向 node_modules/@types。
  2. @types 是 scoped packages(感谢 Mickey 的指出 ),和@babel 类似。@types 下的所有包会默认被引入,你可以通过修改 compilerOptions 来修改默认策略。
  3. types 和 typeRoots 一样也是 compilerOptions 的配置,指定 types 后,typeRoots 下只有被指定的包才会被引入。

参考

  • GitHub - DefinitelyTyped/DefinitelyTyped: The repository for high quality TypeScript type definitions.
  • @types | 深入理解 TypeScript
  • tsconfig.json · TypeScript 中文网 · TypeScript——JavaScript 的超集
  • 理解 Typescript 配置文件 - 个人文章 - SegmentFault 思否

关注我

大家也可以关注我的公众号《脑洞前端》获取更多更新鲜的前端硬核文章,带你认识你不知道的前端。

公众号【 力扣加加】

types是什么意思中文翻译成_types 和 @types 是什么?相关推荐

  1. types是什么意思中文翻译成_types英语_types什么意思_types用法翻译_types英语读音_解释 - 英语宝典...

    types ■Coral is formed by certain types of polyp. 珊瑚是由某些水螅体构成的. ■In a printer, the removable type el ...

  2. 利用python批量将excel中文翻译成英文

    目录 操作过程中不断遇到新的问题,思路的转换过程 背景 第一天 操作过程 第二天 正则表达式是个好东西 第三天 第四天 第五天 遇到的小问题 操作过程中不断遇到新的问题,思路的转换过程 背景 今天接到 ...

  3. Excel可以将中文翻译成英文

    今天要和大家分享的是:Excel可以将中文翻译成英文,先看下面的动图演示 1.先装好该插件,然后打开表格 ​ 2.然后选择汉语 ​ 3.然后选择diy工具箱 ​ 4.选择翻译 ​ 5.弹出对话框设置由 ...

  4. pycharm怎么把中文翻译成英文

    PyCharm是一款很流行的Python编辑器.如果你想要在PyCharm中把中文翻译成英文,你可以这样做: 首先,打开PyCharm的设置.你可以在菜单栏中选择"File" -& ...

  5. googletrans 中文翻译成英文 安装及使用

    googletrans 中文翻译成英文 安装及使用 安装 pip install googletrans==4.0.0rc1 # 安装特定的版本,有些版本不友好,此版本不行,自行更换 用法 def t ...

  6. 怎样将PPT中的中文翻译成英文?实现中英互译简单的方法是什么?

    对于一篇PPT文档我们见到最多的都是中文的形式,但是由于工作需要,我们不得不将中文翻译成英文,很多小伙伴为此很烦恼,如果要是将中文一句句的复制进浏览器中进行查找的话太耽误时间了,也不是一个首选方法,除 ...

  7. html页面国际化之谷歌翻译js实践,支持通过判断浏览器语言自动将中文翻译成英文

    实践过程 最近boss提出了一个需求,需要支持打开的页面自动翻译成英文,csdn来回找资料,最终确定使用谷歌翻译js插件,这个插件测试只支持手动翻译,没能满足打开页面通过判断浏览器语言自动翻译成英文的 ...

  8. 用python做一个文本翻译器,自动将中文翻译成英文,超方便的

    translate非标准库是python中可以实现对多种语言进行互相翻译的库,使用时只需要设置目标语言(比如:中文.英文)后,会自动将原始文本翻译成我们需要的目标语言. [阅读全文] 使用pip的方式 ...

  9. 将下列计算机中文翻译成英文,急...将计算机类英文翻译成中文

    急...将计算机类英文翻译成中文 急...将计算机类英文翻译成中文 Rapid VLIW Processor Customization for Signal Processing Applicati ...

最新文章

  1. linux之gdb基本调试命令和使用总结
  2. 计算机组成原理201501,计算机组成原理201501.pdf
  3. calendar获取本周一的日期_Java Calendar 获取本周周一和周日代码
  4. 用 Python 实现的线程池
  5. html 抓取 post 请求,自动向网页Post信息并提取返回的信息(一)
  6. 企业如何安装linux软件下载,linux系统安装软件方法大全
  7. vxlan报文 wireshark_VXLAN原理_ISIS、BGP、MPLS v隧道、QOS 技术精讲(肖哥)_华为认证视频-51CTO学院...
  8. php 跨站脚本攻击漏洞,PHP跨站脚本攻击(XSS)漏洞修复思路(二)
  9. APP设计邀请功能,用邀请链接还是邀请码比较好呢?
  10. Java数字转中文大写,数字转英文
  11. 华为p8青春版(ALE-UL00)刷机教程
  12. 【POJ C++题目】魔兽世界之一:备战
  13. “云”溪笔谈 | 走完过渡期“沉浸式视频云”时代来临
  14. 【托业】【跨栏】TEST04
  15. Java命令 - 关于jvm性能优化与gc优化相关参数设置
  16. CentOS下的rpm命令使用
  17. 《一笔画问题》解题报告
  18. 绝大多数情况下,没有解决不了的问题,只有因为平时缺少练习而惧怕问题的复杂度,畏惧的心理让我们选择避让,采取并不那么好的方案去解决问题...
  19. python123第五周作业答案_python第五十四天--第十周作业
  20. “超级血狼月”遭遇暴雪 美多地观月活动被迫取消

热门文章

  1. iview tabs里面放入 i-switch slot的写法
  2. mysql php 新手卡生成_PHPMaker(基于MYSQL数据库自动生成PHP 脚本的软件)
  3. vue ui 创建项目 ,添加样式时报错,通过vue ui安装less-loader 和less 依赖后报错,百度告诉说版本太高导致
  4. JQuery中的基本筛选选择器
  5. 三维重建5:场景中语义分析/语义SLAM/DCNN-大尺度SLAM
  6. Writing your first Django app--Django 第一步
  7. linux克隆出现mac地址错误
  8. Vagrant+VirtualBox版本的坑
  9. 【剑指offer】字符串的排列
  10. ios动画效果集锦(持续更新)