翻译:疯狂的技术宅
原文: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. 160310、oracle数据库的读写分离

    PS:使用AbstractRoutingDataSource路由数据源实现动态数据库的调用   1. 连接哪个数据源的环境变量 package com.hysoft.common;   public  ...

  2. quartz任务调度配置 解决jobDetail身份标识存在问题

    applicationContext.xml配置:每五秒轮询一次.注意:周和日期不能同时为通配符”*“ <bean id="planInfoServiceImpl" clas ...

  3. web.xml 中以编码方式添加filter并设置初始化参数AbstractAnnotationConfigDispatchServletInitializer

    web.xml中配置filter <?xml version="1.0" encoding="UTF-8"?> <web-app versio ...

  4. NavagationBar 设置颜色和状态栏设置白色

    ios7以下的版本设置导航栏背景颜色可以使用 [[UINavigationBar appearance] setTintColor:[UIColor orangeColor]]; ios7以后: [[ ...

  5. JMeter场景运行(非GUI方式运行命令)

    JMeter场景运行方式可分为两种:  GUI方式运行,视窗运行,双击jmeter.bat启动运行即可以看到运行界面:  非GUI方式运行,在命令窗口中使用java –jar命名运行: 但不管是以 ...

  6. Web项目管理工具精选(下)

    原文:Web项目管理工具精选(下) 我们在上篇中已推介『代码管理.任务管理.支付工具.数据记录.Dashboard Analytics.客户支持』六个方面的工具.本文将介绍剩下七类工具. A/B测试 ...

  7. java7(1)——反编译深入理解增强的switch(读字节命令实战)

    [本文介绍] 本文主要讲java_7 的改进switch的底层实现.反编译一个使用带String的switch的demo并一步步解析反编译出来的字节命令,从编译的角度解读switch的底层实现. [正 ...

  8. linux qt下 QSqlDatabase: QMYSQL driver not loaded

    出现上述问题是qt安装目录未包含mysql驱动. 解决方法如下: 1.查看系统是否存在libqsqlmysql.so find / -name libqsqlmysql.so 2.若不存在该文件则安装 ...

  9. python subplot 合并子图的方法

  10. jenkins SSH登录 Git配置(通过eclipse生成SSH 密钥)

    1.通过eclipse生成SSH 密钥 菜单栏的windows-->preferences-->General-->Network Connections-->SSH2--&g ...