Graph + AI 中国峰会火热报名中,点击探索图分析更多可能! 了解详情
写点什么

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:002765
用户头像

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

关注

评论

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

长文攻略|如何打造一键部署的云开发应用

binggg

小程序 前端 全栈 开发应用 云开发

如何 3 步一键部署开源容器应用?

binggg

Docker 开源 Serverless 云开发 应用

2021最新版阿里巴巴Java性能调优速成手册强烈推荐

比伯

Java 编程 架构 面试 架构师

2020年中国DevOps应用发展研究——艾瑞咨询报告总结

禅道项目管理

DevOps 行业资讯 趋势

Apache Flink 在实时金融数据湖的应用

Apache Flink

flink

大数据知识专栏 -MapReduce 自定义计数器技术

小马哥

大数据 mapreduce 七日更

即构✖叮咚课堂:行业第一套AI课堂解决方案是怎么被实现的?

ZEGO即构

Android经典面试:46道面试题带你了解中高级Android面试,附面试题答案

欢喜学安卓

android 程序员 面试 移动开发

android开发培训!深度解析跳槽从开始到结束完整流程,系列篇

欢喜学安卓

android 程序员 面试 移动开发

谈谈统计学正态分布阈值原理在数据分析工作中的运用

vivo互联网技术

大数据 正态分布 核心

对容器镜像的思考和讨论

阿里巴巴云原生

Docker 容器 开发者 云原生 CloudNative

15个国内外最受欢迎的YouTube视频下载器

科技猫

youtube视频下载 油管视频下载 下载youtube视频 下载油管视频 视频下载器

Web UI自动化测试之元素定位

行者AI

软件测试 测试 自动化测试

Soul 学习笔记---数据同步 websocket 连接建立过程分析(五)

fightingting

Soul网关

新“庖丁解牛”,华为云技术全牛图解

陈泽涛

架构师训练营第三周作业 -命题作业

阿德儿

基于 KubeEdge 和 Kuiper 的边缘流式数据处理实践

华为云原生团队

数据库 云原生 边缘计算 华为云 边缘技术

备忘录1

Vei

图解分布式之:最终一致性,一致只会迟到,但绝不缺席

四猿外

架构 分布式 分布式系统 一致性 数据一致性

Kafka 中的消息存储在磁盘上的目录布局是怎样的?

码农架构

Java kafka 架构 设计模式

AQS之ReentrantReadWriteLock精讲分析上篇

伯阳

AQS 读写锁 ReentrantReadWriteLock 多线程与高并发 lock

图扑打造智慧化物流仓储管理系统组态仿真

一只数据鲸鱼

物联网 工业4.0 组态软件 智慧物流

比特币矿机工作原理

v16629866266

合约交易APP系统开发|合约交易软件开发

开發I852946OIIO

系统开发

迟到的年度总结-数据的人生

松子(李博源)

大数据 数据中台 总结 年度总结

简单五步:利用Gitstats给代码仓库做一次体检

后台技术汇

28天写作

volatile,还可以有这么硬的理解

云流

Java 程序员 线程

【CSS】画三角形(8个角度及其原理)

学习委员

CSS html5 前端 CSS小技巧 28天写作

初步解析 Elasticsearch Document 核心元数据

escray

elastic 七日更 28天写作 死磕Elasticsearch 60天通过Elastic认证考试

区块链数字货币交易所系统软件APP开发

开發I852946OIIO

系统开发

Hadoop编程实战:HDFS用户Shell详解

罗小龙

hadoop 最佳实践 28天写作 hdfs shell

TypeScript 2.8引入条件类型-InfoQ