如何理解类型any、unknown、{}之间以及它们与其他类型之间的关系?

2023-11-30

试图理解类型之间的关系我有这段代码

type CheckIfExtends<A, B> = A extends B ? true : false;

type T1 = CheckIfExtends<number, unknown>; //true
type T2 = CheckIfExtends<number, {}>; //true
type T3 = CheckIfExtends<number, any>; //true
type T4 = CheckIfExtends<() => void, unknown>; //true
type T5 = CheckIfExtends<() => void, {}>; //true
type T6 = CheckIfExtends<() => void, any>; //true
type T7 = CheckIfExtends<unknown, any>; //true
type T8 = CheckIfExtends<any, unknown>; //true
type T9 = CheckIfExtends<{}, unknown>; //true
type T10 = CheckIfExtends<{}, any>; //true
type T11 = CheckIfExtends<any, {}>; //boolean
type T12 = CheckIfExtends<unknown, {}>; //false

链接到游乐场

有人可以解释一下吗?有什么区别?怎么可能any extends {} and any不延长{}同时?如果any extends unknown and unknown extends any那么这是否意味着它们是强平等的?这是 Typescript 之上的一个新缺陷吗?null and undefindedJavaScript的股权问题?

实际上,

type T = CheckIfExtends<any, number>; //boolean

本质上的区别是这样的:

  • the any type是故意不健全的,因为它可以分配向和从任何其他类型(可能的例外never,取决于您使用它的位置)。不健全意味着类型的一些基本规则被破坏,例如及物性 of 子类型化。一般来说,如果A可分配给B, and B可分配给C, then A可分配给C. But any打破了这一点。例如:string可分配给any, and any可分配给number... but string is not可分配给number。这种特殊的不健全性非常有用,因为它允许我们从本质上“关闭”难以或不可能正确键入的代码部分中的类型检查。但你需要非常仔细地思考any作为一种类型;它更像是一种“非类型”。

  • 空类型,{},是一种在运行时可以像对象一样对待的类型(也就是说,您可以从中读取属性或方法而不会出现运行时错误),但它没有known编译时的属性。这并不意味着它没有属性;而是意味着它没有属性。这只是意味着编译器不知道其中任何一个。这意味着仅null and undefined不可分配给{} (null.foo or undefined.foo是运行时错误)。甚至像这样的原始类型string可以被视为在运行时具有属性和方法("".length and "".toUpperCase()工作,甚至"".foo刚刚返回undefined)。当然,任何实际的对象类型也将被分配给{}.

    另一方面,{}类型不可分配to种类非常多。如果我有类型值{}尝试将其分配给类型的变量{foo: string},将会出现编译错误,如{}不知道含有foo财产。您可以分配{}其本身,或者更广泛的类型,例如unknown,或“un-type”any.

    这使得{} very nearly 顶级类型,这是所有其他类型都可分配给的类型。它本质上是一个顶级类型null and undefined从中删除。

  • the unknown type是在 TypeScript 3.0 中引入的true顶部类型; TypeScript 中的每个类型都可以分配给unknown. Even null and undefined可分配给unknown.

    再说一遍,另一方面,unknown只能分配给它自己和“un-type”any。即便是{}类型不够宽,无法分配unknown到它。反而,unknown本质上相当于{} | null | undefined(并且被视为如此,因为打字稿 4.8)


你的大部分CheckIfExtends<A, B>结果可以用上面的解释。例外的是T11:

type T11 = CheckIfExtends<any, {}>; //boolean

Your CheckIfExtends<A, B>类型定义是一个分配条件类型,当A是联合类型,因为如果联合的各个部分都满足两个分支,则它允许采用条件的两个分支。当A is any,除非当B is any or unknown (so T8行为正常)。有一些关于这个的讨论微软/TypeScript#27418。反正,T11取两个分支,你会得到true | false这是boolean。 (来自 microsoft/TypeScript#27418,unknown in the A位置不分布,所以T7 and T12行为也正常)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何理解类型any、unknown、{}之间以及它们与其他类型之间的关系? 的相关文章

随机推荐

  • 追加到嵌套列表

    我正在使用嵌套列表来查找我创建的字典中的值 然后我想将找到的值附加到列表中 我不知道如何编码的问题是如何将附加的值保留在同一嵌套列表结构中 这是代码 其中最后一行我将值附加到空列表中 Creating a dictionary of FID
  • python 字典组列表

    如何将字典中的相似键分组到列表中 如果我有 data quantity 2 type Vip quantity 23 type Vip quantity 2 type Regular quantity 2 type Regular quan
  • MS Graph Bearer Token 能否用于访问 Office REST API?

    我们已使用 Microsoft Graph 在 Net Core 2 0 应用程序中实现身份验证 以针对 Azure AD 进行身份验证 效果很好 我们的目标是使用 Microsoft Graph 来访问 Office 365 数据 不幸的
  • 在一行中分配多个变量

    我正在尝试制作斐波那契数列 但我不明白为什么会这样 def fibonacci n f1 0 f2 1 i 1 while i lt n print f2 f1 f2 f2 f1 f2 i 1 return f3 返回 1 2 4 8 而
  • ConstraintLayout中的动态circleRadius

    在我的应用程序中 我有以下布局 它使用新的圆形定位其内在的属性ConstraintLayout 我认为它非常好 因为它不为任何视图尺寸使用固定的 dp 值 除了circleRadius 这正是我的问题 我的circleRadius也应该是动
  • 我如何使用 php 和 css 使图像显示在这样的行中?

    我想知道如何显示如图中所示的图像 我知道我必须使用 while 循环检索图像 但是像这样显示它们是困难的一点 谢谢 也许这个 ul li class image img src li li class image img src li li
  • 如何在 PySpark 中使用 .contains() 按单个或多个子字符串进行过滤?

    这是一个简单的问题 我认为 但我不确定回答它的最佳方法 我需要根据 Spark Dataframe 中包含字符串的列中是否存在 子字符串 进行过滤 目前我正在执行以下操作 使用过滤 contains data 1 ABC 2 DEF 3 D
  • Rust 对临时值的不可变和可变引用是如何删除的?

    首先 我知道有很多类似的问题 并且我读过很多讨论 但我仍然无法理解我的情况是怎么回事 struct Test x u32 fn main let mut t mut Test x 0 println t x t mut Test x 1 p
  • JavaFX 和 maven:NullPointerException:需要位置

    我一直在尝试使用 JavaFX 设置 Maven 尽管我对 Maven 和 JavaFX 没有经验 但我没想到它会是一个如此大的挑战 我的 Java 知识相当扎实 包括 Swing 没想到设置起来会这么困难 我从 IntelliJ 13 0
  • Jquery-ui 库不会由 Google CDN 从 Google 站点“插入 html 框”加载/提供服务

    在过去的 3 个月里 我一直在努力使用 Google 网站的 插入 html 框 来让 CDN 为 Jquery 用户界面库 jqueryui 提供服务 但没有取得任何成功 我使用了以下代码及其变体 没有任何主题 但没有效果 jquery
  • 何时以及如何通过 PHP 使用多个 MySQL 查询 (PDO)

    除了最大限度地减少代码之外 在一个语句中使用多个 MySQL 查询还有什么好处 如何使用 PHP 最好是 PDO 执行 检索和显示在一条语句中发送的多个 MySQL 查询的结果 mysql query 不支持多个查询 但是 有一些解决方法
  • Visual Studio 2015没有cl.exe

    我下载了 Visual C 和 Visual Studio 但找不到cl exe编译我的 C 文件 安装路径为 C Program Files x86 Microsoft Visual Studio 14 0 VC bin 在哪里可以找到编
  • 最佳解决方案 - 三元或二元关系

    我正在尝试完成我的一门课程的一个问题 它围绕哪种关系是最佳解决方案 二元或三元 关系示例 所以它是一个视频商店 具有三个实体 视频 会员和休闲 会员和临时工可以借用视频 并记录借用日期 三元关系是否是最合适的解决方案 因为会员和随意借用视频
  • 如何使用 Octopus 部署 azure webjob

    如何使用八达通部署来部署azure webjob 对于我来说 octopus 说它已部署到 azure 但无法在网站下看到我的 webjob 谁能帮助如何实现这一目标 有一个关于如何从 octopus 部署 Web 作业的文档Azure 网
  • 在 SQL Server 性能中处理非常大的表

    我在处理数据库中的一个非常大的表时遇到一些麻烦 在讨论问题之前 我们先谈谈我想要实现的目标 我有两个源表 来源1 SALES MAN ID SMAN SM LATITUDE SM LONGITUDE 来源2 CLIENT ID CLIENT
  • 如何在spring mvc中从jsp文件映射css和js文件

    我是 Spring mvc 的新手 我想在jsp中添加css和js文件 这是一个Spring MVC框架 这是我的 spring dispatcher servlet xml 代码
  • 有没有办法仅将特定的 C# 属性标记为可序列化?

    JsonIgnore 将阻止某个 C 模型属性包含在 JSON 序列化中 我试图忽略模型上的所有属性 除非它们有 JsonInclude 财产 所以它更多的是 选择加入 而不是 选择退出 场景 有什么办法可以实现这一点吗 将以下属性应用于模
  • 需要在套餐订阅的日期中添加周、日和月

    我目前正在为当前项目开发包管理器 我需要添加包订阅日期和包到期日期 我正在使用 php 函数date Y m d H i s i e package subscription start date date Y m d H i s 现在这是
  • 我应该如何处理 Swift 参数验证

    我正在学习斯威夫特 我正在设计一个需要在其初始化程序中进行参数验证的类 如果传递的值超出范围 我该如何处理 考虑到 我真的发现很难找到合适的方法来设计它 Swift 没有异常 在有异常和内置 try catch 机制的语言中 我会抛出异常
  • 如何理解类型any、unknown、{}之间以及它们与其他类型之间的关系?

    试图理解类型之间的关系我有这段代码 type CheckIfExtends