@@ -115,6 +115,7 @@ function maybeConvertType(
115115 return convertType ( context , typeOrNode ) ;
116116}
117117
118+ let typeConversionDepth = 0 ;
118119export function convertType (
119120 context : Context ,
120121 typeOrNode : ts . Type | ts . TypeNode | undefined ,
@@ -123,11 +124,18 @@ export function convertType(
123124 return new IntrinsicType ( "any" ) ;
124125 }
125126
127+ if ( typeConversionDepth > context . converter . maxTypeConversionDepth ) {
128+ return new UnknownType ( "..." ) ;
129+ }
130+
126131 loadConverters ( ) ;
127132 if ( "kind" in typeOrNode ) {
128133 const converter = converters . get ( typeOrNode . kind ) ;
129134 if ( converter ) {
130- return converter . convert ( context , typeOrNode ) ;
135+ ++ typeConversionDepth ;
136+ const result = converter . convert ( context , typeOrNode ) ;
137+ -- typeConversionDepth ;
138+ return result ;
131139 }
132140 return requestBugReport ( context , typeOrNode ) ;
133141 }
@@ -137,6 +145,7 @@ export function convertType(
137145 // will use the origin when serializing
138146 // aliasSymbol check is important - #2468
139147 if ( typeOrNode . isUnion ( ) && typeOrNode . origin && ! typeOrNode . aliasSymbol ) {
148+ // Don't increment typeConversionDepth as this is a transparent step to the user.
140149 return convertType ( context , typeOrNode . origin ) ;
141150 }
142151
@@ -167,7 +176,9 @@ export function convertType(
167176 }
168177
169178 seenTypes . add ( typeOrNode . id ) ;
179+ ++ typeConversionDepth ;
170180 const result = converter . convertType ( context , typeOrNode , node ) ;
181+ -- typeConversionDepth ;
171182 seenTypes . delete ( typeOrNode . id ) ;
172183 return result ;
173184 }
0 commit comments