You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在TypeScript中定义无限嵌套结构的Interface/Type

适配嵌套结构的TypeScript类型定义

要实现你描述的这种叶子节点为固定格式、非叶子节点可嵌套包含叶子或其他非叶子节点的结构,我们可以用TypeScript的递归类型来完成,完美适配任意层级的嵌套需求。

1. 定义基础类型

首先明确叶子节点的固定格式:

// 叶子节点:固定包含dataType字段
type LeafNode = {
  dataType: string;
};

然后定义递归的节点类型,非叶子节点是一个对象,其属性可以是叶子节点,也可以是另一个嵌套的节点结构:

// 递归类型:节点要么是叶子,要么是包含多个节点的对象
type SchemaNode = LeafNode | { [key: string]: SchemaNode };

2. 定义完整结构类型

针对你给出的示例数据,直接基于SchemaNode定义根结构即可:

// 对应示例中的根结构
type RootSchema = {
  sample: SchemaNode;
};

3. 验证示例数据

把你的示例数据(注意修正collectionDate里的笔误:dateType改为dataType)代入,完全符合我们定义的类型:

const sampleSchema: RootSchema = {
  "sample": {
    "tags": { "dataType": "string[]" },
    "isRestricted": { "dataType": "boolean" },
    "organism": {
      "sex": { "dataType": "string" },
      "collection": {
        "collectionDate": {"dataType": "date"},
        "collectionAddress": {
          "addressLine": { "dataType": "string" },
          "city": { "dataType": "string" },
          "postalCode": { "dataType": "string" }
        }
      }
    }
  }
};

补充说明

  • 递归类型SchemaNode会自动处理任意深度的嵌套,不管结构有多少层级,都能正确约束
  • 如果需要更严格的类型校验(比如限制dataType的可选值),可以把string换成联合类型,例如:type DataType = "string" | "boolean" | "date" | "string[]";,再将LeafNode里的dataType改为DataType

内容的提问来源于stack exchange,提问作者Chuanbao Lu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 16:38:16