@@ -478,7 +478,7 @@ function convert_to_ts(js_code, indent = '', offset = '') {
478478
479479 for ( const tag of comment . tags ?? [ ] ) {
480480 if ( ts . isJSDocTypeTag ( tag ) ) {
481- const name = get_type_name ( tag ) ;
481+ const [ name , generics ] = get_type_info ( tag ) ;
482482
483483 if ( ts . isFunctionDeclaration ( node ) ) {
484484 const is_export = node . modifiers ?. some (
@@ -497,7 +497,8 @@ function convert_to_ts(js_code, indent = '', offset = '') {
497497 } `
498498 ) ;
499499 code . appendLeft ( node . body . getStart ( ) , '=> ' ) ;
500- code . appendLeft ( node . body . getEnd ( ) , `) satisfies ${ name } ;` ) ;
500+ const type = generics !== undefined ? `${ name } ${ generics } ` : name ;
501+ code . appendLeft ( node . body . getEnd ( ) , `) satisfies ${ type } ;` ) ;
501502
502503 modified = true ;
503504 } else if (
@@ -522,7 +523,7 @@ function convert_to_ts(js_code, indent = '', offset = '') {
522523 'Unhandled @type JsDoc->TS conversion; needs more params logic: ' + node . getText ( )
523524 ) ;
524525 }
525- const name = get_type_name ( tag ) ;
526+ const [ name ] = get_type_info ( tag ) ;
526527 code . appendLeft ( node . parameters [ 0 ] . getEnd ( ) , `: ${ name } ` ) ;
527528
528529 modified = true ;
@@ -565,21 +566,27 @@ function convert_to_ts(js_code, indent = '', offset = '') {
565566 return transformed === js_code ? undefined : transformed . replace ( / \n \s * \n \s * \n / g, '\n\n' ) ;
566567
567568 /** @param {ts.JSDocTypeTag | ts.JSDocParameterTag } tag */
568- function get_type_name ( tag ) {
569+ function get_type_info ( tag ) {
569570 const type_text = tag . typeExpression . getText ( ) ;
570571 let name = type_text . slice ( 1 , - 1 ) ; // remove { }
571572
572- const import_match = / i m p o r t \( ' ( .+ ?) ' \) \. ( \w + ) / . exec ( type_text ) ;
573+ const import_match = / i m p o r t \( ' ( .+ ?) ' \) \. ( \w + ) ( < { ? [ \n \* \w : ; , ] + } ? > ) ? / . exec ( type_text ) ;
573574 if ( import_match ) {
574- const [ , from , _name ] = import_match ;
575+ const [ , from , _name , generics ] = import_match ;
575576 name = _name ;
576577 const existing = imports . get ( from ) ;
577578 if ( existing ) {
578579 existing . add ( name ) ;
579580 } else {
580581 imports . set ( from , new Set ( [ name ] ) ) ;
581582 }
583+ if ( generics !== undefined ) {
584+ return [ name , generics
585+ . replaceAll ( "*" , "" ) // get rid of JSDoc asterisks
586+ . replace ( " }>" , "}>" ) // unindent closing brace
587+ ] ;
588+ }
582589 }
583- return name ;
590+ return [ name ] ;
584591 }
585592}
0 commit comments