Properly check types in template literal placeholders (#40498)

* Properly check types in template literal placeholders

* Add regression test

* Update test

* Accept new baselines
This commit is contained in:
Anders Hejlsberg
2020-09-11 14:48:35 -10:00
committed by GitHub
parent ea51fabb7c
commit eee799fe0c
6 changed files with 216 additions and 189 deletions

View File

@@ -31548,16 +31548,16 @@ namespace ts {
registerForUnusedIdentifiersCheck(node);
}
function checkTemplateType(node: TemplateLiteralTypeNode) {
forEachChild(node, checkSourceElement);
getTypeFromTypeNode(node);
function checkTemplateLiteralType(node: TemplateLiteralTypeNode) {
for (const span of node.templateSpans) {
checkSourceElement(span.type);
const type = getTypeFromTypeNode(span.type);
checkTypeAssignableTo(type, templateConstraintType, span.type);
if (!everyType(type, t => !!(t.flags & TypeFlags.Literal) || isGenericIndexType(t))) {
error(span.type, Diagnostics.Template_literal_type_argument_0_is_not_literal_type_or_a_generic_type, typeToString(type));
}
}
getTypeFromTypeNode(node);
}
function checkImportType(node: ImportTypeNode) {
@@ -36198,7 +36198,7 @@ namespace ts {
case SyntaxKind.InferType:
return checkInferType(<InferTypeNode>node);
case SyntaxKind.TemplateLiteralType:
return checkTemplateType(<TemplateLiteralTypeNode>node);
return checkTemplateLiteralType(<TemplateLiteralTypeNode>node);
case SyntaxKind.ImportType:
return checkImportType(<ImportTypeNode>node);
case SyntaxKind.NamedTupleMember: