TypeScript 3.3来了!快看看有什么新功能
翻译:疯狂的技术宅
原文:https://github.com/Microsoft/TypeScript/wiki/What's-new-in-TypeScript
本文首发微信公众号:jingchengyideng
欢迎关注,每天都给你推送新鲜的前端技术文章
改进了调用联合类型的行为
在TypeScript的早期版本中,不同的联合类型如果想互相访问其取值,它们参数的取值列表必须完全一致才行。
type Fruit = "apple" | "orange";
type Color = "red" | "orange";
type FruitEater = (fruit: Fruit) => number; // 吃水果并对它们排名
type ColorConsumer = (color: Color) => string; // 处理颜色并对其进行描述
declare let f: FruitEater | ColorConsumer;
// Cannot invoke an expression whose type lacks a call signature.
// 无法调用这个表达式,因为缺少调用签名类型。
// Type 'FruitEater | ColorConsumer' has no compatible call signatures.ts(2349)
// 类型 'FruitEater | ColorConsumer' 没有兼容的调用签名.ts(2349)
f("orange");
不管怎样,在上面的例子中,FruitEater 和 ColorConsumer 都应该能够接受字符串"orange",并返回 number 或 string 类型才对。
在TypeScript 3.3中,下面这段代码将不再会报错。
type Fruit = "apple" | "orange";
type Color = "red" | "orange";
type FruitEater = (fruit: Fruit) => number; // 吃水果并对它们排名
type ColorConsumer = (color: Color) => string; // 处理颜色并对其进行描述
declare let f: FruitEater | ColorConsumer;
f("orange"); // 可以正常工作!将返回一个'number | string'.
f("apple"); // error - Argument of type '"red"' is not assignable to parameter of type '"orange"'.
f("red"); // error - Argument of type '"red"' is not assignable to parameter of type '"orange"'.
在TypeScript 3.3中,这些参数会互相交织在一起然后创建新签名。
在上面的例子中, fruit 和 color 的参数列表会被交叉到一起产生新的 Fruit&Color 类型的参数。 Fruit & Color会处理为 ("apple" | "orange") & ("red" | "orange") ,它等同于("apple" & "red") | ("apple" & "orange") | ("orange" & "red") | ("orange" & "orange")。 那些不可能的组合被处理成 never,到最后留下了 "orange" & "orange" 这个组合,结果只能是 "orange"。
注意
当联合中最多只有一个类型具有多个重载时,这种新行为才会出现,并且联合中最多只能有一个类型具有通用签名。 这意味着 number[] | string[]这种形式 ,在 map (通用)这样的方法中仍然不可以调用。
另一方面,在 forEach 这样的方法中现在可以调用,但是在 noImplicitAny 下可能存在一些问题。
interface Dog {
kind: "dog"
dogProp: any;
}
interface Cat {
kind: "cat"
catProp: any;
}
const catOrDogArray: Dog[] | Cat[] = [];
catOrDogArray.forEach(animal => {
// ~~~~~~ error!
// 参数'animal'隐式含有'any'类型。
});
在TypeScript 3.3中,这仍然很严格,添加显式类型注释将解决这个问题。
interface Dog {
kind: "dog"
dogProp: any;
}
interface Cat {
kind: "cat"
catProp: any;
}
const catOrDogArray: Dog[] | Cat[] = [];
catOrDogArray.forEach((animal: Dog | Cat) => {
if (animal.kind === "dog") {
animal.dogProp;
// ...
}
else if (animal.kind === "cat") {
animal.catProp;
// ...
}
});
使用 --build --watch 检查复合项目的增量文件
TypeScript 3.0 引入了一个用于构建过程的被称为“复合项目”的新功能。 其目的之一是确保用户可以将大型项目拆分为更小的部分,从而能够快速构建,同时保留项目结构,而不会影响现有的 TypeScript 体验。 正式因为有了复合项目,TypeScript 可以用 --build 模式仅重新编译部分项目和依赖项集。 您可以把它视为对项目间构建的优化。
TypeScript 2.7还引入了 --watch 模式,通过新的增量“构建器”API进行构建。 该模式只重新检查和传送被修改的,可能会影响类型检查的源码文件和依赖。 您可以将其视为对项目内构建的优化。
在3.3版本之前,在使用 --build --watch 构建复合项目时,实际上并没有使用这种监视增量文件的基础结构。 在 --build --watch 模式下,如果一个项目中有了更新,将会强制完全重新构建该项目,而不是检查项目中有哪些文件受到影响。
在TypeScript 3.3中, --build 模式的 --watch 标志也可以利用增量文件机制进行监视了。 这可能意味着在 --build --watch 模式下构建速度能将会更快。 在我们的测试中,此功能使--build --watch 的构建时间比原来缩短了50%到75%。 您可以阅读与文件修改时的原始拉取请求相关的更多内容来查看这些数据,我们相信大多数使用复合项目的用户将会在此处得到更好的体验。
本文首发微信公众号:jingchengyideng
欢迎关注,每天都给你推送新鲜的前端技术文章
关注后回复“体系”,检查自己的前端知识体系是否完整
来源:https://segmentfault.com/a/1190000017997665
TypeScript 3.3来了!快看看有什么新功能的更多相关文章
- 还在用难用的AssetBundle?快来运用Unity新的可寻址资源系统,助力游戏开发
Unity Addressables可寻址资源系统是一个强大的Unity资源包,它能够帮助解决游戏开发中最重要的一些挑战:高效率和轻松的内容管理. 在管理游戏资源时,往往很难维持好的标准,从而避免让项 ...
- xcode10设置自定义代码快 - Xcode10新功能新内容
1. 2. 详情: Xcode10新功能新内容https://blog.csdn.net/u010960265/article/details/80630118
- 如何最快实现物流即使查询功能-物流轨迹查询API
上一篇文章我们介绍了一个物流服务提供商,推荐大家使用快递鸟接口,主要介绍了如何注册账号,获得密钥,找不到注册地址的,我在发一下: http://kdniao.com/reg 今天我们来聊如何利用快递鸟 ...
- 使用TypeScript开发程序
简介 TypeScript一直发展不错,我们公司在开发新功能时,考虑到程序的可维护性,使用了TypeScript编写浏览器上的程序,我们是从零开始使用TypeScript,甚至我连javascript ...
- TypeScript开发程序
使用TypeScript开发程序 简介 TypeScript一直发展不错,我们公司在开发新功能时,考虑到程序的可维护性,使用了TypeScript编写浏览器上的程序,我们是从零开始使用TypeScri ...
- mysql dba系统学习(6)二进制日志binlog之二
MySQL 5.5 中对于二进制日志 (binlog) 有 3 种不同的格式可选:Mixed,Statement,Row,默认格式是 Statement.总结一下这三种格式日志的优缺点.MySQL R ...
- Mysql binlog
理解Mysql binlog 日志的三种模式 本文介绍下,mysql中binlog日志的三种模式,了解了各种模式的不同之处,才能更好地应用.有需要的朋友建议参考下. 一,模式1 Row Lev ...
- Mysql的二进制日志binlog的模式说明
binlog模式总共可分为以下三种:row,statement,mixed 1.Row日志中会记录成每一行数据被修改的形式,然后在slave端再对相同的数据进行修改,只记录要修改的数据,只有value ...
- 浅谈MySQL Replication(复制)基本原理
1.MySQL Replication复制进程MySQL的复制(replication)是一个异步的复制,从一个MySQL instace(称之为Master)复制到另一个MySQL instance ...
随机推荐
- js 实现table表格拖拽和点击表头升降序排序
js 实现table表格拖拽和点击表头升降序排序,写的比较乱,用的时候可以把其中的一些模块函数提取出来 样式,由于是可拖拽表格,所以样式 table tr th{cursor:move;} js实现 ...
- ORACLE内存结构之SGA
SGA的管理: SQL> show parameter sga NAME TYPE VALUE ---------- ...
- qt model view 编程总结
看不见的root的 QModelIndex() 是 无效的 list 和table 的index 函数中的parent参数就只要 root QModelIndex 就可以,因为没有层级概念 Model ...
- mysql json
SELECT name, profile->"$.twitter" AS `twitter` FROM `user` WHERE profile->"$.tw ...
- Spark源码分析 – SparkEnv
SparkEnv在两个地方会被创建, 由于SparkEnv中包含了很多重要的模块, 比如BlockManager, 所以SparkEnv很重要 Driver端, 在SparkContext初始化的时候 ...
- 剑指Offer——扑克牌顺子
题目描述: LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^)...他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他 ...
- Python慢,为啥还有大公司用?
PyCon 是全世界最大的以 Python 编程语言 为主题的技术大会,大会由 Python 社区组织,每年举办一次.在 Python 2017 上,Instagram 的工程师们带来了一个有关 Py ...
- git学习------> Gitlab如何进行备份恢复与迁移?
前段时间,在某台CenterOS服务器上搭建了Gitlab环境,并且大家陆陆续续的都把代码从svn迁移到了gitlab,但是之前的CenterOS服务器并不是搭建在公司的机房环境,而是搭建在办公室的某 ...
- python web框架 MVC MTV
WEB框架 MVC Model View Controller 数据库 模板文件 业务处理 MTV Model Template View 数据库 模板文件 业务处理
- sipp模拟freeswitch分机测试(SIP协议调试)
1.freeswitch安装 1) 网上很多安装方法都不靠谱,系统版本,各种依赖库一堆问题,下面是验证的可行的. yum install -y http://files.freeswitch.org/ ...