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

如何在TypeScript中为对象编写条件递归类型

解决TypeScript中Def类型的递归嵌套问题

要实现abc属性的递归嵌套,你需要把Def中每个键对应的结构定义成递归类型,让abc的值可以复用自身的结构。以下是修正后的类型定义:

修正后的完整类型代码

export type T1 = "p" | "q" | "r" | "a" | "b";

export type T2 = {
  h: string;
  hc: {};
};

// 定义递归的项类型,让abc可以嵌套自身
export type DefItem = {
  [K in T1 | "abc"]?: K extends T1
    ? T2
    : DefItem; // 这里把abc的类型指向DefItem,实现递归
};

export interface Def {
  [k: string]: DefItem;
}

export interface A {
  name: string;
  def: Def;
}

验证预期用法

现在你的示例代码可以正常通过类型检查,abc属性可以无限递归嵌套:

const x: A = {
  name: "test",
  def: {
    xxx: {
      p: {
        h: "s",
        hc: {},
      },
      abc: {
        p: {
          h: "s",
          hc: {},
        },
        abc: {
          p: {
            h: "s",
            hc: {},
          },
          // 还可以继续嵌套abc
          abc: {
            q: { h: "another", hc: {} }
          }
        },
      },
    },
  },
};

说明

原来的定义中,abc对应的类型是{[k in T1]?: T2},只能包含T1的键,无法嵌套abc。通过抽离出DefItem递归类型,让abc的类型指向DefItem本身,就实现了递归嵌套的能力。

内容的提问来源于stack exchange,提问作者It worked yesterday.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 03:05:19