返回介绍

Top Type

发布于 2024-09-11 00:55:48 字数 1490 浏览 0 评论 0 收藏 0

类型层级的顶端只有 any 和 unknown 这两兄弟。

Object 类型自然会是 any 与 unknown 类型的子类型。

type Result22 = Object extends any ? 1 : 2; // 1
type Result23 = Object extends unknown ? 1 : 2; // 1

但如果把条件类型的两端对调一下呢?

type Result24 = any extends Object ? 1 : 2; // 1 | 2
type Result25 = unknown extends Object ? 1 : 2; // 2

你会发现,any 竟然调过来,值竟然变成了 1 | 2?

type Result26 = any extends 'wangxiaobai' ? 1 : 2; // 1 | 2
type Result27 = any extends string ? 1 : 2; // 1 | 2
type Result28 = any extends {} ? 1 : 2; // 1 | 2
type Result29 = any extends never ? 1 : 2; // 1 | 2

实际上,还是因为“系统设定”的原因。any 代表了任何可能的类型,当使用 any extends 时,它包含了“让条件成立的一部分”,以及“让条件不成立的一部分”。

而从实现上说,在 TypeScript 内部代码的条件类型处理中,如果接受判断的是 any,那么会直接返回条件类型结果组成的联合类型。

因此 any extends string 并不能简单地认为等价于以下条件类型:

type Result30 = ("I'm string!" | {}) extends string ? 1 : 2; // 2

这种情况下,由于联合类型的成员并非均是字符串字面量类型,条件显然不成立。

在赋值给其他类型时,any 来者不拒,而 unknown 则只允许赋值给 unknown 类型和 any 类型,这也是由于“系统设定”的原因,即 any 可以表达为任何类型。

你需要我赋值给这个变量?那我现在就是这个变量的子类型了,我是不是很乖巧?

另外,any 类型和 unknown 类型的比较也是互相成立的:

type Result31 = any extends unknown ? 1 : 2;  // 1
type Result32 = unknown extends any ? 1 : 2;  // 1

虽然还是存在系统设定的部分,但仍然只关注类型信息层面的层级,即结论为:Object < any / unknown。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文