Linux 之父出席、干货分享、圆桌讨论,精彩尽在 OpenCloudOS 社区开放日,报名戳 了解详情
写点什么

TypeScript 2.8 引入条件类型

  • 2018 年 4 月 11 日
  • 本文字数:1088 字

    阅读完需:约 4 分钟

看新闻很累?看技术新闻更累?试试下载 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:002941
用户头像

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

关注

评论

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

Week 4 -作业1

shuyaxx

架构师训练营第八周学习笔记

郎哲158

极客大学架构师训练营

第八周学习总结

饭桶

关于“区块链+”的所有关键点

CECBC

区块链 监管

架构师训练营 第四周 学习总结

阿光

week4 代码重构 作业和学习总结

杨斌

架构师训练营第二期 Week 4 作业

bigxiang

极客大学架构师训练营

还有人不知道JVM调优参数?一次性打包发给你

田维常

JVM jvm调优

RCEP是重振全球经济和反对保护主义的有力工具

CECBC

经济建设 世界经济

架构师训练营第八周课后练习

薛凯

周练习 8

何毅曦

【第八周】课后作业

云龙

训练营第八周作业 1

仲夏

极客大学架构师训练营

架构师训练营 - 第八周总结

一个节点

极客大学架构师训练营

架构师训练营第二期 Week 4 总结

bigxiang

极客大学架构师训练营

架构师训练营 1 期第 8 周:性能优化(二)- 作业

piercebn

极客大学架构师训练营

week08作业

追风

架构师一期

架构师训练营第八周作业

郎哲158

极客大学架构师训练营

第八周作业

orchid9

新基建为数字经济注入新动能

CECBC

区块链 大数据

第四周作业一

jingx

DDIA 读书笔记(6)数据库事务

莫黎

读书笔记

架构师训练营 第四周 作业

阿光

架构师训练营—第八周学习总结

Geek_shu1988

极客大学架构师训练营

《JavaScript高级程序设计》.pdf

田维常

Java 电子书

国产大数据系统通过验收,”核高基”基础软件再下一城

陈泽云

人工智能 大数据 知识产权 操作系统

一个典型的大型互联网应用系统使用了哪些技术方案和手段

皮蛋

架构师训练营 第三周 作业

阿光

第八周总结

orchid9

架构师训练营 第三周 学习总结

阿光

架构师训练营第 2 期 第四周总结

月下独酌

极客大学架构师训练营

GPU容器虚拟化:用户态和内核态的技术和实践详解

GPU容器虚拟化:用户态和内核态的技术和实践详解

TypeScript 2.8引入条件类型_JavaScript_Dylan Schiemann_InfoQ精选文章