当前位置: 首页 > 知识库问答 >
问题:

类型化无限递归推理

司寇书
2023-03-14

查看我在某处(这里是游乐场)找到的这个Typescript4.2片段:

type BlackMagic<T> = { [K in keyof T]: BlackMagic<T[K]> }

declare const foo: BlackMagic<{q: string}>;
declare const str: BlackMagic<string>;
declare const num: BlackMagic<12>;

我的头不能绕着它。TS如何处理这件事?它怎么不卡在无限递归里?具体地说,对于strnum的情况,悬停在变量上显示TS将类型解析为string12。这是怎么回事?

共有1个答案

隗俊誉
2023-03-14

如果您的类型包含具有相同tblackmagic ,那么您将陷入无限递归,但这里我们将实用程序类型blackmagic应用于不同的值t[K]

type BlackMagic<T> = { [K in keyof T]: BlackMagic<T[K]> }

此类型表示Blackmagic 是一个对象,其中键是T的键,值是T的值的Blackmagic映射版本。

在示例中,blackmagic类型实际上并不执行任何操作strnum

如果T是基元类型而不是对象,则Blackmagic 只是T本身。这是作为映射类型的实用工具类型的标准行为。例如,部分<12>只是12。这一行为在FAQ常见的不是bug的“bug”中进行了解释

声明为{[kin in keyof T]:U}(其中T是类型参数)的映射类型称为同态映射类型,这意味着映射类型是T的结构保持函数。使用基元类型实例化类型参数t时,映射的类型计算为相同的基元。

foo:blackmagic<{q:string}>实际上会进行一些映射,但它只深一级。blackmagic<{q:string}>变为{q:blackmagic } 。我们刚刚看到blackmagic string,因此接下来的类型变为{q:string}

 类似资料:
  • 我从本例中的createDataFrame调用中获得了一个StackOverflow Error。它起源于涉及java类型推理的scala代码,该代码在无限循环中调用自己。 堆栈跟踪的底部如下所示: 这与中报告的错误类似http://apache-spark-developers-list.1001551.n3.nabble.com/Stackoverflow-in-createDataFrame

  • (Scala 2.11.8) 我有一个类似GenTableLike的特征,具有复杂的自递归类型签名,它定义了连接兼容表实现的方法。我还有一个层次结构 下面是一个稍微简化的片段,其中问题仍然存在: 我是不是做错了什么? 自类型和转置类型用于定义函数返回类型。我还有一个IndexedTable实现定义如下,所以我不能返工自类型以接受3个参数

  • 问题内容: 我的一个朋友在Java API(https://docs.oracle.com/javase/7/docs/api/java/lang/Enum.html)中找到了这个窍门, 并通过阅读以下文章https://docs.oracle.com/javase/tutorial/java/generics/genTypes.html我可以理解上述行在语法上的含义,但是从给出的示例中我无法弄清

  • 标准 ML 没有多态递归。在模块语言中添加递归允许我们使用内函子的固定点将多态递归恢复为一种特殊情况。例如: 众所周知,多态递归使得类型推理不可判定。然而,函子定义已经包含部分类型信息,即其参数的签名。这些信息足以使类型推理再次可判定吗?

  • 本文向大家介绍PHP实现递归无限级分类,包括了PHP实现递归无限级分类的使用技巧和注意事项,需要的朋友参考一下 在一些复杂的系统中,要求对信息栏目进行无限级的分类,以增强系统的灵活性。那么PHP是如何实现无限级分类的呢?我们在本文中使用递归算法并结合mysql数据表实现无限级分类。 递归,简单的说就是一段程序代码的重复调用,当把代码写到一个自定义函数中,将参数等变量保存,函数中重复调用函数,直到达

  • 我正在制作一种强类型的玩具函数式编程语言。它使用Hindley Milner算法作为类型推断算法。 在实现该算法时,我有一个问题,即如何推断相互递归函数的类型。 和是相互递归的函数。现在,当类型检查器推断函数的类型时,它也应该能够推断函数的类型,因为它是一个子表达式。 但是,在那一刻,函数还没有定义。因此,显然,类型检查器甚至不知道函数的存在,以及函数的类型。 真实世界的编译器/Inteprete