如何创建递归类型?

Posted

技术标签:

【中文标题】如何创建递归类型?【英文标题】:How to create recursive type? 【发布时间】:2022-01-21 02:34:33 【问题描述】:

我有一些元素,其子元素的结构与其父元素相同。当我使用 TypeScript 创建它们的类型时,我遇到了一些错误。我该如何解决这个问题?

type RowRecord = Record<string, CellData>;
type CellData = string | number | RowRecord;

错误:

类型别名“CellData”循环引用自身。 类型别名“RowRecord”循环引用自身。

示例记录:


    "id": "60f49dbb3ee1a9241749abb6",
    "gender": "female",
    "firstName": "Millicent",
    "lastName": "Harrington",
    "birthDate": "2013-05-14T04:35:49.400Z",
    "age": 8,
    "email": "millicent@harrington.com",
    "address": 
      "country": "USA",
      "state": "Utah",
      "city": "Cecilia",
      "street": "Newkirk Placez",
      "houseNumber": 969
    
  

【问题讨论】:

【参考方案1】:

您可以将Record 扩展为它所代表的对象

type RowRecord =  [K in string]: CellData ; // or  [k: string]: CellData 
type CellData = string | number | RowRecord;

TypeScript 不允许您的定义,因为 Record&lt;string, CellData&gt; 被急切地评估。如果你给 TS 一个对象类型,那么 TypeScript 会认识到它可以推迟对该类型的评估,从而允许递归定义。

【讨论】:

我已经尝试过您的解决方案并且它有效。但我不知道这样的“ [k: string]: CellData ”数据结构。你能告诉我这是什么或推荐我任何关于它的来源吗? [k: string] 有一个index signature,[k in string] 是一个mapped type

以上是关于如何创建递归类型?的主要内容,如果未能解决你的问题,请参考以下文章

创建具有自引用类型提示的递归数据类

具有递归数据类型的二叉树的后序遍历

SQL:如何从递归查询创建视图?

模式注册表中的递归 avro 模式类型

如何在 Qt 中递归创建目录?

如何创建引用自身的视图(递归)