翻译:疯狂的技术宅
原文: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");

不管怎样,在上面的例子中,FruitEaterColorConsumer 都应该能够接受字符串"orange",并返回 numberstring 类型才对。

在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中,这些参数会互相交织在一起然后创建新签名。

在上面的例子中, fruitcolor 的参数列表会被交叉到一起产生新的 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

转载于:https://www.cnblogs.com/qixidi/p/10406211.html

TypeScript 3.3来了!快看看有什么新功能相关推荐

  1. TypeScript - 不止稳,而且快

    前言 关于 TypeScript 是什么,应该大部分人都已经知道了,但是在这儿,还是摘抄一下知乎的回答: TypeScript 是 JavaScript 的强类型版本.然后在编译期去掉类型和特有语法, ...

  2. TypeScript 3.0 新功能介绍(二)

    2019独角兽企业重金招聘Python工程师标准>>> 转载 TypeScript 3.0 新功能介绍(二) TypeScript 3.0 新功能介绍(二) New unknown ...

  3. android 如何获得附近的wifi,Android 8.1推出新功能,一键帮你找到周围最快的WiFi

    原标题:Android 8.1推出新功能,一键帮你找到周围最快的WiFi [猎云网(微信号:ilieyun)]1月23日报道(编译:福尔摩望) 距离Android 8.1 Oreo发布重大更新已经过去 ...

  4. 教你 TypeScript 4.3 新功能的实践应用

    本文通过解决在实际工作中遇到的问题,层层剖析解法,带你了解 TS4.3 的高级特性,一起来看看吧. 目录 还原问题现场 解决方案拆解,由浅入深 第一步:核心技术支撑 第二步:Template Lite ...

  5. Revit插件 | 精装模块15个新功能正式上线,快来体验

    大家好,这里是建模助手. 建模助手建模.算量.出图,一站搞定的--精装模块,正式上线了! 简单来说,精装模块就是辅助用户快速搭建精装修模型,便于后续的模型渲染.出量.出图工作. 目前暂时上线15个功能 ...

  6. 快易拍联合新浪微公益一起为贫困孩子过温暖新年吧!

    山区贫困孩童没有温暖的大衣和棉鞋,只有一件缝缝补补的旧衣,快易拍联合新浪微公益共同为贫困孩童温暖过新年,每一人转发就捐助1元,而我们的指尖,将成为温暖他们的力量,捐助贫困孩童的公益活动款项还未完成,希 ...

  7. 【看这里】网易云信 IM 红包上线啦!最快3小时集成红包功能

    网易云信 IM 红包功能上线啦! 网易云信 IM 红包是由网易云信联合金融魔方提供的一款安全合规.易于集成.功能丰富的金融服务,可以让 App 快速具备收发红包功能,支持单聊.群组.聊天室全社交场景, ...

  8. 面对面快传文件服务器恢复,QQ 面对面快传的传应用功能,如何找到已安装应用的安装包?...

    在手机里我们通常看不到已安装应用的安装包,但是有时我们又会有些好玩的应用或游戏给好友分享.没有网络的情况下怎么办呢? 有朋友发现了QQ的面对面快传能直接发送已安装应用的apk.惊了(惊恐脸).因为在我 ...

  9. 最快60秒完成新冠病毒核酸对比 阿里云向社会免费开放基因计算服务

    全球疫情肆虐,各大科技公司都在竭尽全力抗击疫情.3月13日,阿里云对外宣布,将向医疗科研机构.疾控中心等一线病毒研究机构免费开放基因计算服务,可大幅提升宏基因组测序.疫苗研发相关的处理效率,最快只需6 ...

最新文章

  1. 【面试招聘】双非渣硕的秋招路
  2. 前端通过spark-md5.js计算本地文件md5
  3. python中获取异常描述与else用法
  4. Android studio每次启动卡在fetching Android sdk compoment information的解决方案
  5. web表格在css中属性,CSS属性之表格(Table)_html/css_WEB-ITnose
  6. 手机能识别sim卡但是没信号_一篇文章扫盲手机SIM卡相关知识
  7. [源]云计算技术堆栈系列——鸟瞰
  8. 算法笔记(个人用)(不定期更新)
  9. STATA:面板数据滞后需要注意(同一家企业滞后出现空缺数据的原因)
  10. 赖世雄英语学习三原则
  11. UltraEdit注册机
  12. while 循环语句的使用
  13. 如何利用用户分层来提高运营效率?
  14. 一篇不大正经的有关素数的小结
  15. 知识产权代理行业公司竞争分析
  16. 计算机455端口,455端口怎么关闭-455端口关闭的方法 - 河东软件园
  17. 【圈外同学】Day01 一个模型,帮你找到真正热爱的
  18. anaconda 上实现Tensorflow MASK R-CNN Demo Windows (CPU版)
  19. 自杀和抑郁症是为了进化?
  20. UniAPP 安卓应用版本自动更新及下载安装

热门文章

  1. linux efi不要boot目录,linux – 找不到efi目录:grub-install的问题
  2. springboot启动报错:Unregistering JMX-exposed beans on shutdown
  3. Nutch2.4 存储方式配置
  4. android 闹钟服务,如果闹钟时间已经过去,android可以防止即时触发闹钟服务
  5. android cursor 实例化,为什么Cursor放到带参数带返回值方法里就报错?
  6. linux usb 重启,在ubuntu下重启指定的USB口
  7. python中数字是常量吗,【python】常量与变量
  8. php+数学计算公式,PHP数学计算函数总结
  9. 合泰单片机 熔丝_合泰单片机HT66F018红外发射C程序及电路图
  10. python无参数装饰器_python_之无参装饰器_01