BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

TypeScript 2.8引入条件类型

| 作者 Dylan Schiemann 关注 2 他的粉丝 ,译者 无明 关注 0 他的粉丝 发布于 2018年4月12日. 估计阅读时间: 4 分钟 | GMTC大前端的下一站,PWA、Web框架、Node等最新最热的大前端话题邀你一起共同探讨。

亲爱的读者:我们最近添加了一些个人消息定制功能,您只需选择感兴趣的技术主题,即可获取重要资讯的邮件和网页通知

看新闻很累?看技术新闻更累?试试下载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

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我
社区评论

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT