@@ -13438,13 +13438,16 @@ namespace ts {
13438
13438
let i = 0;
13439
13439
while (i < types.length) {
13440
13440
const t = types[i];
13441
- if (t.flags & TypeFlags.Literal) {
13442
- const s = applyTemplateCasing(getTemplateStringForType(t) || "", casings[i]);
13441
+ const casingType = casings[i];
13442
+ const isGeneric = isGenericIndexType(t);
13443
+ const resolvable = (t.flags & TypeFlags.Literal) || (!isGeneric && casingType === TemplateCasing.TypeOf);
13444
+ if (resolvable) {
13445
+ const s = applyTemplateCasing(getTemplateStringForType(t, casingType) || "", casingType);
13443
13446
texts = [...texts.slice(0, i), texts[i] + s + texts[i + 1], ...texts.slice(i + 2)];
13444
13447
casings = [...casings.slice(0, i), ...casings.slice(i + 1)];
13445
13448
types = [...types.slice(0, i), ...types.slice(i + 1)];
13446
13449
}
13447
- else if (isGenericIndexType(t) ) {
13450
+ else if (isGeneric ) {
13448
13451
i++;
13449
13452
}
13450
13453
else {
@@ -13462,7 +13465,10 @@ namespace ts {
13462
13465
return type;
13463
13466
}
13464
13467
13465
- function getTemplateStringForType(type: Type) {
13468
+ function getTemplateStringForType(type: Type, casing: TemplateCasing) {
13469
+ if (casing === TemplateCasing.TypeOf) {
13470
+ return getTypeNameForErrorDisplay(type);
13471
+ }
13466
13472
return type.flags & TypeFlags.StringLiteral ? (<StringLiteralType>type).value :
13467
13473
type.flags & TypeFlags.NumberLiteral ? "" + (<NumberLiteralType>type).value :
13468
13474
type.flags & TypeFlags.BigIntLiteral ? pseudoBigIntToString((<BigIntLiteralType>type).value) :
@@ -31418,7 +31424,9 @@ namespace ts {
31418
31424
getTypeFromTypeNode(node);
31419
31425
for (const span of node.templateSpans) {
31420
31426
const type = getTypeFromTypeNode(span.type);
31421
- checkTypeAssignableTo(type, templateConstraintType, span.type);
31427
+ if (span.casing !== TemplateCasing.TypeOf) {
31428
+ checkTypeAssignableTo(type, templateConstraintType, span.type);
31429
+ }
31422
31430
if (!everyType(type, t => !!(t.flags & TypeFlags.Literal) || isGenericIndexType(t))) {
31423
31431
error(span.type, Diagnostics.Template_type_argument_0_is_not_literal_type_or_a_generic_type, typeToString(type));
31424
31432
}
0 commit comments