Consistently check assignability to template literal placeholders (#56598)

This commit is contained in:
Anders Hejlsberg
2023-11-29 14:51:39 -08:00
committed by GitHub
parent e5513254a3
commit 68b9b07264
6 changed files with 76 additions and 4 deletions

View File

@@ -25017,12 +25017,12 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
}
function isValidTypeForTemplateLiteralPlaceholder(source: Type, target: Type): boolean {
if (source === target || target.flags & (TypeFlags.Any | TypeFlags.String)) {
return true;
}
if (target.flags & TypeFlags.Intersection) {
return every((target as IntersectionType).types, t => t === emptyTypeLiteralType || isValidTypeForTemplateLiteralPlaceholder(source, t));
}
if (target.flags & TypeFlags.String || isTypeAssignableTo(source, target)) {
return true;
}
if (source.flags & TypeFlags.StringLiteral) {
const value = (source as StringLiteralType).value;
return !!(target.flags & TypeFlags.Number && isValidNumberString(value, /*roundTripOnly*/ false) ||
@@ -25035,7 +25035,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
const texts = (source as TemplateLiteralType).texts;
return texts.length === 2 && texts[0] === "" && texts[1] === "" && isTypeAssignableTo((source as TemplateLiteralType).types[0], target);
}
return isTypeAssignableTo(source, target);
return false;
}
function inferTypesFromTemplateLiteralType(source: Type, target: TemplateLiteralType): Type[] | undefined {