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

使用TypeScript Checker提取数组嵌套及联合类型的复杂类型遇阻

TypeScript复杂类型提取:数组嵌套类型捕获与联合类型处理

我正在从TypeScript代码库中提取复杂关联类型,已经用TypeScript checker实现了部分功能,但在处理数组内的嵌套类型时卡住了。

当前实现能提取直接关联的嵌套类型(比如PrettyNestedType),但无法捕获数组形式的嵌套类型(比如SomethingElse里的PrettyNestedType[])。我需要的预期输出是:

[ 'NestedObjectType', 'SomethingElse', 'PrettyNestedType', 'Imask' ]

只有当PrettyNestedType以非数组形式(value2: PrettyNestedType;)关联时,当前代码才能正常工作。


目标类型源码

type NestedObjectType = {
  value1: string;
  value2: number;
  value3: Date;
  value4: SomethingElse;
};

type SomethingElse = {
  value2: PrettyNestedType[];
};

type PrettyNestedType = {
  value1: string;
  value2: number;
  value3: Date;
  test: Imask;
};

interface Imask {
  hello: string;
}

interface MainObjectType {
  value1: string;
  value2: number;
  value3: Date;
  propertyWithTypeAlias: NestedObjectType;
}

数组嵌套类型捕获修复思路

要处理数组类型,需要在遍历类型时判断当前类型是否为数组类型(ts.TypeFlags.Array),如果是,就取出它的元素类型(通过typeArguments[0]获取),再递归处理这个元素类型。

修改核心逻辑如下:

function collectRelatedTypes(type: ts.Type, checker: ts.TypeChecker, collected: Set<string>) {
  // 跳过基础类型、内置类型
  if (type.flags & (ts.TypeFlags.String | ts.TypeFlags.Number | ts.TypeFlags.Boolean | ts.TypeFlags.Date)) {
    return;
  }

  // 处理数组类型:提取元素类型再递归
  if (type.flags & ts.TypeFlags.Array) {
    const arrayType = type as ts.TypeReference;
    if (arrayType.typeArguments && arrayType.typeArguments.length > 0) {
      collectRelatedTypes(arrayType.typeArguments[0], checker, collected);
    }
    return;
  }

  // 处理类型别名/接口等自定义类型
  const symbol = type.getSymbol();
  if (symbol && symbol.name !== '__type') {
    collected.add(symbol.name);
    // 遍历类型的属性,递归处理属性类型
    checker.getPropertiesOfType(type).forEach(prop => {
      const propType = checker.getTypeOfSymbolAtLocation(prop, prop.valueDeclaration!);
      collectRelatedTypes(propType, checker, collected);
    });
  }
}

联合类型处理思路

对于联合类型(ts.TypeFlags.Union),需要遍历联合类型中的每个子类型,分别递归处理:

// 在collectRelatedTypes函数开头添加联合类型判断
if (type.flags & ts.TypeFlags.Union) {
  const unionType = type as ts.UnionType;
  unionType.types.forEach(subType => {
    collectRelatedTypes(subType, checker, collected);
  });
  return;
}

这样不管是数组嵌套还是联合类型里的自定义类型,都能被正确捕获到。

内容的提问来源于stack exchange,提问作者U rock

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 22:55:31