TypeScript 4.8 RC 发布

TypeScript 4.8 首个 RC 已发布。开发团队表示,从现在开始到发布 TypeScript 4.8 稳定版本,预计除了修复重要错误之外不会有进一步的变化。

主要更新内容包括:


交叉类型与联合类型的类型收窄增强

TypeScript 4.8 版本对--strictNullChecks进行了进一步增强,主要体现在联合类型与交叉类型,以及类型收窄地表现上。

举例来说,作为 TypeScript 类型系统中的 Top Type ,unknown 类型包含所有的其他类型,实际上 unknown 和{} | null | undefined的效果是一致的:独特意义的 null、undefined 类型,加上万物起源的{}

模板字符串类型中的 infer 提取

在 4.7 版本中 TypeScript 支持了 infer extends 语法,使得我们可以直接一步就 infer 到预期类型的值,而不需要再次进行条件语句判断:

type FirstString<T> =
    T extends [infer S, ...unknown[]]
        ? S extends string ? S : never
        : never;
​
// 基于 infer extends
type FirstString<T> =
    T extends [infer S extends string, ...unknown[]]
        ? S
        : never;

4.8 版本在此基础上进行了进一步地增强,当 infer 被约束为一个原始类型,那么它现在会尽可能将 infer 的类型信息推导到字面量类型的级别:

// 此前为 number,现在为 '100'
type SomeNum = "100" extends `${infer U extends number}` ? U : never;
​
// 此前为 boolean,现在为 'true'
type SomeBool = "true" extends `${infer U extends boolean}` ? U : never;

同时,TypeScript 会检查提取出的值能否重新映射回初始的字符串,如 SomeNum 中会检查String(Number("100"))是否等于"100",在下面这个例子中就是因为无法重新映射回去,而导致只能推导到 number 类型:

// String(Number("1.0")) → "1",≠ "1.0"
type JustNumber = "1.0" extends `${infer T extends number}` ? T : never; 

绑定类型中的类型推导

TypeScript 中的泛型填充也会受到其调用方的影响,如以下示例:

declare function chooseRandomly<T>(x: T,): T;
​
const res1 = chooseRandomly(["linbudu", 599, false]);

此时 res1 的类型与函数的泛型 T 会被推导为Array<string | number | boolean>,但如果我们换一个方法:

declare function chooseRandomly<T>(x: T,): T;
​
const [a, b, c] = chooseRandomly(["linbudu", 599, false]);

此时 a、b、c 被推导为了 string、number、boolean 类型,也就是说此时函数的泛型被填充为[string, number, boolean]这么个元组类型。

这一泛型填充方式被称为绑定模式(Binding Pattern),而在 4.8 版本中,禁用了基于绑定模式的类型推导,因为其对泛型的影响并不始终正确:

declare function f<T>(x?: T): T;
​
const [x, y, z] = f();

详情查看发布公告

优秀的个人博客,低调大师

微信关注我们

原文链接:https://www.oschina.net/news/206526/typescript-4-8-rc-released

转载内容版权归作者及来源网站所有!

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

相关文章

发表评论

资源下载

更多资源
Mario,低调大师唯一一个Java游戏作品

Mario,低调大师唯一一个Java游戏作品

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Eclipse(集成开发环境)

Eclipse(集成开发环境)

Eclipse 是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse 附带了一个标准的插件集,包括Java开发工具(Java Development Kit,JDK)。

Java Development Kit(Java开发工具)

Java Development Kit(Java开发工具)

JDK是 Java 语言的软件开发工具包,主要用于移动设备、嵌入式设备上的java应用程序。JDK是整个java开发的核心,它包含了JAVA的运行环境(JVM+Java系统类库)和JAVA工具。

Sublime Text 一个代码编辑器

Sublime Text 一个代码编辑器

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。