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

TypeScript 3.3来了!快看看有什么新功能的更多相关文章

  1. 还在用难用的AssetBundle?快来运用Unity新的可寻址资源系统,助力游戏开发

    Unity Addressables可寻址资源系统是一个强大的Unity资源包,它能够帮助解决游戏开发中最重要的一些挑战:高效率和轻松的内容管理. 在管理游戏资源时,往往很难维持好的标准,从而避免让项 ...

  2. xcode10设置自定义代码快 - Xcode10新功能新内容

    1. 2. 详情: Xcode10新功能新内容https://blog.csdn.net/u010960265/article/details/80630118

  3. 如何最快实现物流即使查询功能-物流轨迹查询API

    上一篇文章我们介绍了一个物流服务提供商,推荐大家使用快递鸟接口,主要介绍了如何注册账号,获得密钥,找不到注册地址的,我在发一下: http://kdniao.com/reg 今天我们来聊如何利用快递鸟 ...

  4. 使用TypeScript开发程序

    简介 TypeScript一直发展不错,我们公司在开发新功能时,考虑到程序的可维护性,使用了TypeScript编写浏览器上的程序,我们是从零开始使用TypeScript,甚至我连javascript ...

  5. TypeScript开发程序

    使用TypeScript开发程序 简介 TypeScript一直发展不错,我们公司在开发新功能时,考虑到程序的可维护性,使用了TypeScript编写浏览器上的程序,我们是从零开始使用TypeScri ...

  6. mysql dba系统学习(6)二进制日志binlog之二

    MySQL 5.5 中对于二进制日志 (binlog) 有 3 种不同的格式可选:Mixed,Statement,Row,默认格式是 Statement.总结一下这三种格式日志的优缺点.MySQL R ...

  7. Mysql binlog

    理解Mysql binlog 日志的三种模式   本文介绍下,mysql中binlog日志的三种模式,了解了各种模式的不同之处,才能更好地应用.有需要的朋友建议参考下.   一,模式1 Row Lev ...

  8. Mysql的二进制日志binlog的模式说明

    binlog模式总共可分为以下三种:row,statement,mixed 1.Row日志中会记录成每一行数据被修改的形式,然后在slave端再对相同的数据进行修改,只记录要修改的数据,只有value ...

  9. 浅谈MySQL Replication(复制)基本原理

    1.MySQL Replication复制进程MySQL的复制(replication)是一个异步的复制,从一个MySQL instace(称之为Master)复制到另一个MySQL instance ...

随机推荐

  1. 【BZOJ4254】Aerial Tramway 树形DP

    [BZOJ4254]Aerial Tramway 题意:给你一座山上n点的坐标,让你在山里建m条缆车,要求缆车两端的高度必须相等,且中间经过的点的高度都小于缆车的高度.并且不能存在一个点位于至少k条缆 ...

  2. Android软键盘的隐藏显示研究

    http://winuxxan.blog.51cto.com/2779763/522810 全局推: android:windowSoftInputMode="adjustResize&qu ...

  3. 在Windows上手动安装php开发环境

    安装MySQL 使用官方提供提供的安装包一键安装即可. 打开 mysql,选择Windows,MSI Installer点击下载.附:最新版mysql5.7.18下载地址 点击installer安装, ...

  4. Jsp 公用标签库

    <%@ page language="java" pageEncoding="UTF-8"%> <%@ taglib prefix=" ...

  5. protobuf在java应用中通过反射动态创建对象(DynamicMessage)

    ---恢复内容开始--- 最近编写一个游戏用到protobuf数据格式进行前后台传输,苦于protobuf接受客户端的数据时是需要数据类型的如xxx.parseForm(...),这样就要求服务器在接 ...

  6. Educational Codeforces Round 25 E. Minimal Labels&&hdu1258

    这两道题都需要用到拓扑排序,所以先介绍一下什么叫做拓扑排序. 这里说一下我是怎么理解的,拓扑排序实在DAG中进行的,根据图中的有向边的方向决定大小关系,具体可以下面的题目中理解其含义 Educatio ...

  7. transform的妙用---实现div不定宽高垂直水平居中

    transform的兼容性 transform的兼容性还是比较乐观的.IE9以下不兼容,IE9支持代替的-ms-transform属性不过只支持2D转换. 谷歌和Safari支持代替的-webkit- ...

  8. ubuntu14下创建软件的快捷启动方式

    下载软件,使用softname/bin/softname.sh即可启动,但是很麻烦,每次都要打开terminal 为了方便,我们需要创建desktop文件指向这个启动软件的shell文件(以创建Pyc ...

  9. windows 最大支持线程数

    WINDOWS操作系统中可以允许最大的线程数 默认情况下,一个线程的栈要预留1M的内存空间 而一个进程中可用的内存空间只有2G,所以理论上一个进程中最多可以开2048个线程 但是内存当然不可能完全拿来 ...

  10. oracle入门(8)——实战:支持可变长参数、多种条件、多个参数排序、分页的存储过程查询组件

    [本文介绍] 学了好几天,由于项目需要,忙活了两天,写出了个小组件,不过现在还只能支持单表操作.也没考虑算法上的优化,查询速度要比hibernate只快了一点点,可能是不涉及多表查询的缘故吧,多表的情 ...