文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
Top Type
类型层级的顶端只有 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论