@@ -22,6 +22,8 @@ import {
22
22
UnknownType ,
23
23
MappedType ,
24
24
} from "../models" ;
25
+ import { TemplateLiteralType } from "../models/types/template-literal" ;
26
+ import { zip } from "../utils/array" ;
25
27
import { Context } from "./context" ;
26
28
import { ConverterEvents } from "./converter-events" ;
27
29
import { createSignature } from "./factories/signature" ;
@@ -68,6 +70,7 @@ export function loadConverters() {
68
70
namedTupleMemberConverter ,
69
71
mappedConverter ,
70
72
literalTypeConverter ,
73
+ templateLiteralConverter ,
71
74
thisConverter ,
72
75
tupleConverter ,
73
76
typeOperatorConverter ,
@@ -500,6 +503,7 @@ const mappedConverter: TypeConverter<
500
503
templateType : ts . Type ;
501
504
typeParameter : ts . TypeParameter ;
502
505
constraintType : ts . Type ;
506
+ nameType ?: ts . Type ;
503
507
}
504
508
> = {
505
509
kind : [ ts . SyntaxKind . MappedType ] ,
@@ -514,7 +518,8 @@ const mappedConverter: TypeConverter<
514
518
? removeUndefined ( templateType )
515
519
: templateType ,
516
520
kindToModifier ( node . readonlyToken ?. kind ) ,
517
- optionalModifier
521
+ optionalModifier ,
522
+ node . nameType ? convertType ( context , node . nameType , target ) : void 0
518
523
) ;
519
524
} ,
520
525
convertType ( context , type , node , target ) {
@@ -529,7 +534,8 @@ const mappedConverter: TypeConverter<
529
534
? removeUndefined ( templateType )
530
535
: templateType ,
531
536
kindToModifier ( node . readonlyToken ?. kind ) ,
532
- optionalModifier
537
+ optionalModifier ,
538
+ type . nameType ? convertType ( context , type . nameType , target ) : void 0
533
539
) ;
534
540
} ,
535
541
} ;
@@ -601,6 +607,33 @@ const literalTypeConverter: TypeConverter<
601
607
} ,
602
608
} ;
603
609
610
+ const templateLiteralConverter : TypeConverter <
611
+ ts . TemplateLiteralTypeNode ,
612
+ ts . TemplateLiteralType
613
+ > = {
614
+ kind : [ ts . SyntaxKind . TemplateLiteralType ] ,
615
+ convert ( context , node , target ) {
616
+ return new TemplateLiteralType (
617
+ node . head . text ,
618
+ node . templateSpans . map ( ( span ) => {
619
+ return [
620
+ convertType ( context , span . type , target ) ,
621
+ span . literal . text ,
622
+ ] ;
623
+ } )
624
+ ) ;
625
+ } ,
626
+ convertType ( context , type , _node , target ) {
627
+ assert ( type . texts . length === type . types . length + 1 ) ;
628
+ const parts : [ Type , string ] [ ] = [ ] ;
629
+ for ( const [ a , b ] of zip ( type . types , type . texts . slice ( 1 ) ) ) {
630
+ parts . push ( [ convertType ( context , a , target ) , b ] ) ;
631
+ }
632
+
633
+ return new TemplateLiteralType ( type . texts [ 0 ] , parts ) ;
634
+ } ,
635
+ } ;
636
+
604
637
const thisConverter : TypeConverter < ts . ThisTypeNode > = {
605
638
kind : [ ts . SyntaxKind . ThisType ] ,
606
639
convert ( ) {
0 commit comments