@@ -13439,12 +13439,15 @@ namespace ts {
1343913439            let text = texts[0];
1344013440            for (let i = 0; i < types.length; i++) {
1344113441                const t = types[i];
13442-                 if (t.flags & TypeFlags.Literal) {
13443-                     const s = applyTemplateCasing(getTemplateStringForType(t) || "", casings[i]);
13442+                 const casingType = casings[i];
13443+                 const isGeneric = isGenericIndexType(t);
13444+                 const resolvable = (t.flags & TypeFlags.Literal) || (!isGeneric && casingType === TemplateCasing.TypeOf);
13445+                 if (resolvable) {
13446+                     const s = applyTemplateCasing(getTemplateStringForType(t, casingType) || "", casingType);
1344413447                    text += s;
1344513448                    text += texts[i + 1];
1344613449                }
13447-                 else if (isGenericIndexType(t) ) {
13450+                 else if (isGeneric ) {
1344813451                    newTypes.push(t);
1344913452                    newCasings.push(casings[i]);
1345013453                    newTexts.push(text);
@@ -13466,7 +13469,10 @@ namespace ts {
1346613469            return type;
1346713470        }
1346813471
13469-         function getTemplateStringForType(type: Type) {
13472+         function getTemplateStringForType(type: Type, casing: TemplateCasing) {
13473+             if (casing === TemplateCasing.TypeOf) {
13474+                 return getTypeNameForErrorDisplay(type);
13475+             }
1347013476            return type.flags & TypeFlags.StringLiteral ? (<StringLiteralType>type).value :
1347113477                type.flags & TypeFlags.NumberLiteral ? "" + (<NumberLiteralType>type).value :
1347213478                type.flags & TypeFlags.BigIntLiteral ? pseudoBigIntToString((<BigIntLiteralType>type).value) :
@@ -31424,7 +31430,9 @@ namespace ts {
3142431430            getTypeFromTypeNode(node);
3142531431            for (const span of node.templateSpans) {
3142631432                const type = getTypeFromTypeNode(span.type);
31427-                 checkTypeAssignableTo(type, templateConstraintType, span.type);
31433+                 if (span.casing !== TemplateCasing.TypeOf) {
31434+                     checkTypeAssignableTo(type, templateConstraintType, span.type);
31435+                 }
3142831436                if (!everyType(type, t => !!(t.flags & TypeFlags.Literal) || isGenericIndexType(t))) {
3142931437                    error(span.type, Diagnostics.Template_type_argument_0_is_not_literal_type_or_a_generic_type, typeToString(type));
3143031438                }
0 commit comments