使用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
相关产品推荐
相关产品推荐

