写点什么

TypeScript 2.8 引入条件类型

2018 年 4 月 11 日

看新闻很累?看技术新闻更累?试试下载 InfoQ 手机客户端,每天上下班路上听新闻,有趣还有料!

最新发布的 TypeScript 2.8 包含了若干主要特性和一些问题修复,其中最为重要的是新增了条件类型,开发人员可以根据其他类型的特征为变量选择适当的类型。

条件类型最适合与泛型组合在一起使用。如果一个框架总是重复相同的选择性代码,就会变得很繁琐。JavaScript 可以在运行时根据具体值做出决策,与之类似,TypeScript 的条件类型可以根据其他类型的特征来做出决策。

TypeScript 团队给出了一个示例,使用更灵活的接口代替原先繁琐的 API:

原先:

复制代码
interface Id { id: number, /* other fields */ }
interface Name { name: string, /* other fields */ }
declare function createLabel(id: number): Id;
declare function createLabel(name: string): Name;
declare function createLabel(name: string | number): Id | Name;

替换为:

复制代码
type IdOrName<T extends number | string> =   T extends number ? Id : Name;
declare function createLabel<T extends number | string>(idOrName: T):   T extends number ? Id : Name;

条件类型提供了 infer 关键字来推断类型,用于替代手动获取类型。TypeScript 为此提供了一个示例,他们创建了一个叫作 Flatten 的类型,用于将数组转成他们需要的元素类型:

type Flatten<T> = T extends any[] ? T[number] : T;如果使用关键字 infer 就可以将上面的代码简化成:

type Flatten<T> = T extends Array<infer U> ? U : T;条件类型也为联合类型带来了改进,现在可以根据条件类型来分配联合类型。

另外,TypeScript 还增加了若干新的类型别名(Exclude、Extract、InstanceType、NonNullable、ReturnType),这些类型别名也是基于条件类型的。TypeScript 团队因此可以更高效地直接往语言里添加额外的类型模式。

TypeScript 2.8 还增加了一个新的–emitDeclarationOnly标记,用于分离 TypeScript 定义文件和 JavaScript 文件,从而改进了使用 Babel 7 转换 TypeScript 代码的过程。

该版本还为 React 和 JSX 用户带来了一些有关编译注释和 JSX 模块解析的改进。

现在可以使用-operator或新的 Required 类型来移除标识符。

其他小改进还包括:用于清理 ES 模块导入的辅助工具和对未初始化类属性检查的改进。

总体来说,TypeScript 2.8 带来了若干改进,大部分都是基于新引入的条件类型,现在可以定义更复杂的类型。

可以通过npm install -g typescript来安装最新的 TypeScript 2.8,或者直接从 GitHub 上下载。TypeScript 2.9 正在开发中,预计 5 月下旬发布。

查看英文原文 TypeScript 2.8 Release Includes Conditional Types

2018 年 4 月 11 日 19:002706
用户头像

发布了 731 篇内容, 共 376.2 次阅读, 收获喜欢 1880 次。

关注

评论

发布
暂无评论
发现更多内容

Java为什么用迭代器

卢卡多多

7月日更

做大做强肉牛产业,生物资产解决方案助力乡村振兴

CECBC区块链专委会

自学编程!用半年成功拿到35k ! 吃透阿里大牛总结的Java核心知识点

架构大师

Java 程序员 java编程 Java学习 Java核心笔记

Python 正则表达式急速入门

喵叔

7月日更

大神万字总结:InnoDB锁类型及其详细分析

Java架构

Java 编程 架构 微服务 架构师

三流外包程序员,意外获得被各大厂封杀的面试宝典,斩获阿里P7offer

喝酸奶不舔盖

Java 面试 JVM

细说节流(Throttle)和防抖(Debounce)

devpoint

防抖 节流 7月日更

勇敢牛牛不怕困难,撸完华为18级高并发编程笔记与JDK源码剖析手册,感觉我又”行“了

架构大师

Java 程序员 jdk源码 java编程 Java学习

Vue进阶(四):使用 Vuex + axios 发送请求

No Silver Bullet

Vue axios vuex 7月日更 vue-resources

网络攻防学习笔记 Day84

穿过生命散发芬芳

网络攻防 7月日更

程序员必备技能之SpringBoot的自动装配原理,很详细,建议收藏!!!

AI乔治

Java spring 架构 微服务 springboot

使用Apache Spark构建可靠的数据湖(九)

数据与智能

spark Data Lake iceberg Hudi

腾讯三面:哨兵挂了,Redis还能正常工作吗?

Java架构

Java 编程 架构 程序人生 架构师

阿里巴巴支付宝面试 5 轮暴击,差点扛不住了!但终获 Offer

Java架构

Java 编程 架构 面试 架构师

985毕业的“打工人”,大厂java开发2年被裁,重新出发终于拿下腾讯offer

神奇小汤圆

Java 架构 面试 计算机

攒学分赢大奖

IT蜗壳-Tango

7月日更

Linux之grep命令

入门小站

Linux

Spring之 EL表达式

邱学喆

语法规则 Expression ExpressionParser ParserContext EvaluationContext

通证与区块链:前台经济+后台技术

CECBC区块链专委会

在线正则表达式可视化工具

入门小站

工具

Python OpenCV 图像的二值化操作再次学习与图像平滑处理(卷积处理)

梦想橡皮擦

Python 7月日更

如何与同事相处

escray

极客时间 学习笔记 朱赟的技术管理课 7月日更

一文读懂区块链技术如何改变非洲贸易(下)

CECBC区块链专委会

Git标星25K,美团大佬私藏的SpringSecurity笔记,堪比教科书级

神奇小汤圆

Java spring 编程 架构 计算机

终于有华为技术官用500页笔记,把大学四年没会的网络协议讲清了

架构大师

Java 程序员 网络协议 网络 Java学习

Redis - 配置文件

旺仔大菜包

redis

Apache Druid 安装的时候进行 Java 版本校验没有输出

HoneyMoose

从家里到阿里,学弟求职的一年

程序员鱼皮

Java 数据库 redis 面试 求职

链表表示一个数字,求两个数字相加之和,返回一个链表

程序员晓华

鞍座

2021年WEB全栈开发技术栈

devpoint

Vue 全栈 7月日更

强强联手:2021强网杯LongTimeAgo复盘分析

网络安全学海

网络安全 信息安全 渗透测试 漏洞扫描 强网杯

新晋管理者都会遇到的6个问题

新晋管理者都会遇到的6个问题

TypeScript 2.8引入条件类型-InfoQ