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

发布了 5 篇内容,共 245 次阅读,收获喜欢 0 次。

关注

评论

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

JAVA主流锁

颇风

多线程 Java、

给苹果提醒APP配个助手

BabyKing

提醒助手 TODO 奇妙清单 Reminders Helper

识别代码中的坏味道(三)

Page

敏捷开发 面向对象 重构 代码质量 代码坏味道

程序员的晚餐 | 5 月 18 日 瓠子,年少时的味道

清远

美食

Spring Security 中的授权操作原来这么简单

江南一点雨

Java spring Spring Boot spring security

ZooKeeper,到底如何选主?

奈学教育

换脸新潮流:BIGO风靡全球的人脸风格迁移技术

DT极客

Web3极客日报 #128

谢锐 | Frozen

区块链 开源 技术社区 Rebase Web3 Daily

Redis缓存三大问题

Bruce Duan

redis 缓存穿透 缓存击穿 缓存雪崩

Kafka系列第7篇:你必须要知道集群内部工作原理的一些事!

z小赵

大数据 kafka 实时计算

单核小鸡上的Minikube实践(一)

💯

Docker Linux DevOps k8s minikube

Vue+SpringBoot+SpreadJS 实现的在线文档

Geek_Willie

Spring Boot Vue SpreadJS

设计模式前传——为什么要学设计模式

海星

Java 面试 设计模式

Live2D for Unity入门篇 4.x

波波

编程 游戏开发 Live2D Unity

Kotlin 协程实践(2)之 异步和Callback地狱

陈吉米

Java kotlin 协程

CentOS 6 升级 glibc

wong

centos glibc

MySQL事务解析

一个有志气的DB

MySQL 事务隔离级别 mysql事务

DDD 实践手册(番外篇: 事件风暴-概念)

Joshua

领域驱动设计 DDD 事件风暴 事件驱动 Event Storming

npm下载electron缓慢的问题

玏佾

npm Electron

如何更自信的写作

七镜花园-董一凡

写作

NIO看破也说破(四)—— Java的NIO

小眼睛聊技术

Java 开源 学习方法 架构 后端

回“疫”录(20):世界从来不会欺负听话的人

小天同学

疫情 回忆录 现实纪录 纪实

半小时手工解决的活,让我意外学会了 python 的 pdfkit 库

Sicolas Flamel

Python python教程

Deno 入门手册:附大量 TypeScript 代码实例

寇云

node.js typescript

东哥和刘亦菲的故事

张利东

R

中小企业如何做运维自动化?

Spug运维

运维 spug 运维自动化 jenkins ansible

从零开始制作一台计算机-概述

小兵

计算机基础

Web3极客日报#127

谢锐 | Frozen

区块链 开源 技术社区 Rebase Web3 Daily

谈谈控制感(7):底线思维与控制感

史方远

职场 心理 成长

游戏夜读 | Two Sum问题的八个解

game1night

产品周刊 | 第 15 期(20200517)

Herbert

产品 设计 产品经理 产品设计

TypeScript 2.8引入条件类型-InfoQ