in src/utils/getTSType.ts [412:460]
function getTSTypeWithResolvedTypes(
path: NodePath,
typeParams: TypeParameters | null,
importer: Importer,
): TypeDescriptor<TSFunctionSignatureType> {
if (t.TSTypeAnnotation.check(path.node)) {
path = path.get('typeAnnotation');
}
const node = path.node;
let type: TypeDescriptor;
const isTypeAlias = t.TSTypeAliasDeclaration.check(path.parentPath.node);
// When we see a typealias mark it as visited so that the next
// call of this function does not run into an endless loop
if (isTypeAlias) {
if (visitedTypes[path.parentPath.node.id.name] === true) {
// if we are currently visiting this node then just return the name
// as we are starting to endless loop
return { name: path.parentPath.node.id.name };
} else if (typeof visitedTypes[path.parentPath.node.id.name] === 'object') {
// if we already resolved the type simple return it
return visitedTypes[path.parentPath.node.id.name];
}
// mark the type as visited
visitedTypes[path.parentPath.node.id.name] = true;
}
if (node.type in tsTypes) {
type = { name: tsTypes[node.type] };
} else if (t.TSLiteralType.check(node)) {
type = {
name: 'literal',
// @ts-ignore
value: node.literal.raw || `${node.literal.value}`,
};
} else if (node.type in namedTypes) {
type = namedTypes[node.type](path, typeParams, importer);
} else {
type = { name: 'unknown' };
}
if (isTypeAlias) {
// mark the type as unvisited so that further calls can resolve the type again
visitedTypes[path.parentPath.node.id.name] = type;
}
return type;
}