@@ -161,10 +161,10 @@ module.exports = createRule({
161161 const calleeDeclaration = getCalleeDeclaration ( services , node ) ;
162162 if ( ! calleeDeclaration ) return ;
163163
164- if ( hasJSDocThrowsTag ( sourceCode , nodeToComment ) ) {
165- const calleeThrowsTypes = toFlattenedTypeArray ( getJSDocThrowsTagTypes ( checker , calleeDeclaration ) ) ;
166- if ( ! calleeThrowsTypes . length ) return ;
164+ const calleeThrowsTypes = toFlattenedTypeArray ( getJSDocThrowsTagTypes ( checker , calleeDeclaration ) ) ;
165+ if ( ! calleeThrowsTypes . length ) return ;
167166
167+ if ( hasJSDocThrowsTag ( sourceCode , nodeToComment ) ) {
168168 const callerDeclarationTSNode =
169169 getDeclarationTSNodeOfESTreeNode ( services , callerDeclaration ) ;
170170
@@ -176,10 +176,10 @@ module.exports = createRule({
176176 . map ( tag => tag . typeExpression ?. type )
177177 . filter ( tag => ! ! tag ) ;
178178
179- const callerThrowsTypes = getJSDocThrowsTagTypes ( checker , callerDeclarationTSNode ) ;
179+ const callerThrowsTypes = toFlattenedTypeArray ( getJSDocThrowsTagTypes ( checker , callerDeclarationTSNode ) ) ;
180180
181181 if (
182- isTypesAssignableTo ( checker , calleeThrowsTypes , callerThrowsTypes )
182+ isTypesAssignableTo ( services . program , calleeThrowsTypes , callerThrowsTypes )
183183 ) {
184184 return ;
185185 }
@@ -188,8 +188,16 @@ module.exports = createRule({
188188 if ( ! lastThrowsTypeNode ) return ;
189189
190190 const notAssignableThrows = calleeThrowsTypes
191- . filter ( ( t ) => ! callerThrowsTypes
192- . some ( ( n ) => checker . isTypeAssignableTo ( t , n ) ) ) ;
191+ . filter ( ( calleeType ) => ! callerThrowsTypes
192+ . some ( ( callerType ) => {
193+ if (
194+ utils . isErrorLike ( services . program , callerType ) &&
195+ utils . isErrorLike ( services . program , calleeType )
196+ ) {
197+ return utils . typeIsOrHasBaseType ( calleeType , callerType ) ;
198+ }
199+ return checker . isTypeAssignableTo ( calleeType , callerType ) ;
200+ } ) ) ;
193201
194202 if ( ! notAssignableThrows . length ) return ;
195203
@@ -228,21 +236,14 @@ module.exports = createRule({
228236 // If there is only one throws tag, make it as a union type
229237 return fixer . replaceTextRange (
230238 [ lastThrowsTypeNode . pos , lastThrowsTypeNode . end ] ,
231- calleeThrowsTypes
232- . map ( t => utils . getTypeName ( checker , t ) ) . join ( ' | ' ) ,
239+ typesToUnionString ( checker , [ ...callerThrowsTypes , ...calleeThrowsTypes ] )
233240 ) ;
234241 } ,
235242 } ) ;
236243
237244 return ;
238245 }
239246
240- const calleeTags = getJSDocThrowsTags ( calleeDeclaration ) ;
241-
242- const isCalleeThrows = calleeTags . length > 0 ;
243- if ( ! isCalleeThrows ) return ;
244-
245- const calleeThrowsTypes = getJSDocThrowsTagTypes ( checker , calleeDeclaration ) ;
246247 context . report ( {
247248 node,
248249 messageId : 'implicitPropagation' ,
0 commit comments