Skip to content

Commit a04ecb5

Browse files
Check constraints deeply on singleton types.
1 parent 8cf2466 commit a04ecb5

File tree

1 file changed

+16
-11
lines changed

1 file changed

+16
-11
lines changed

src/compiler/checker.ts

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -15764,23 +15764,13 @@ namespace ts {
1576415764
}
1576515765
}
1576615766

15767-
if (isLiteralType(source) && !typeCouldHaveNoTopLevelSingletonTypes(target)) {
15767+
if (isLiteralType(source) && !typeCouldHaveTopLevelSingletonTypes(target)) {
1576815768
generalizedSourceType = getTypeNameForErrorDisplay(getBaseTypeOfLiteralType(source));
1576915769
}
1577015770

1577115771
reportError(message, generalizedSourceType, targetType);
1577215772
}
1577315773

15774-
function typeCouldHaveNoTopLevelSingletonTypes(type: Type) {
15775-
return forEachType(type, typeCouldHaveNoTopLevelSingletonTypesWorker);
15776-
}
15777-
15778-
function typeCouldHaveNoTopLevelSingletonTypesWorker(type: Type): boolean {
15779-
return (type.flags & TypeFlags.Intersection)
15780-
? !!forEach((type as IntersectionType).types, typeCouldHaveNoTopLevelSingletonTypesWorker)
15781-
: isUnitType(type) || !!(type.flags & TypeFlags.Instantiable);
15782-
}
15783-
1578415774
function tryElaborateErrorsForPrimitivesAndObjects(source: Type, target: Type) {
1578515775
const sourceType = symbolValueDeclarationIsContextSensitive(source.symbol) ? typeToString(source, source.symbol.valueDeclaration) : typeToString(source);
1578615776
const targetType = symbolValueDeclarationIsContextSensitive(target.symbol) ? typeToString(target, target.symbol.valueDeclaration) : typeToString(target);
@@ -17375,6 +17365,21 @@ namespace ts {
1737517365
}
1737617366
}
1737717367

17368+
function typeCouldHaveTopLevelSingletonTypes(type: Type): boolean {
17369+
if (type.flags & TypeFlags.UnionOrIntersection) {
17370+
return !!forEach((type as IntersectionType).types, typeCouldHaveTopLevelSingletonTypes);
17371+
}
17372+
17373+
if (type.flags & TypeFlags.Instantiable) {
17374+
const constraint = getConstraintOfType(type);
17375+
if (constraint) {
17376+
return typeCouldHaveTopLevelSingletonTypes(constraint);
17377+
}
17378+
}
17379+
17380+
return isUnitType(type);
17381+
}
17382+
1737817383
function getBestMatchingType(source: Type, target: UnionOrIntersectionType, isRelatedTo = compareTypesAssignable) {
1737917384
return findMatchingDiscriminantType(source, target, isRelatedTo, /*skipPartial*/ true) ||
1738017385
findMatchingTypeReferenceOrTypeAliasReference(source, target) ||

0 commit comments

Comments
 (0)