Skip to content

Commit f2c32d2

Browse files
committed
Include mapped types in type inference infinite recursion check
1 parent 5ba678a commit f2c32d2

File tree

1 file changed

+21
-17
lines changed

1 file changed

+21
-17
lines changed

src/compiler/checker.ts

Lines changed: 21 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -8586,19 +8586,6 @@ namespace ts {
85868586
}
85878587
}
85888588
else {
8589-
if (getObjectFlags(target) & ObjectFlags.Mapped) {
8590-
const constraintType = getConstraintTypeFromMappedType(<MappedType>target);
8591-
if (getObjectFlags(source) & ObjectFlags.Mapped) {
8592-
inferFromTypes(getConstraintTypeFromMappedType(<MappedType>source), constraintType);
8593-
inferFromTypes(getTemplateTypeFromMappedType(<MappedType>source), getTemplateTypeFromMappedType(<MappedType>target));
8594-
return;
8595-
}
8596-
if (constraintType.flags & TypeFlags.TypeParameter) {
8597-
inferFromTypes(getIndexType(source), constraintType);
8598-
inferFromTypes(getUnionType(map(getPropertiesOfType(source), getTypeOfSymbol)), getTemplateTypeFromMappedType(<MappedType>target));
8599-
return;
8600-
}
8601-
}
86028589
source = getApparentType(source);
86038590
if (source.flags & TypeFlags.Object) {
86048591
if (isInProcess(source, target)) {
@@ -8619,15 +8606,32 @@ namespace ts {
86198606
sourceStack[depth] = source;
86208607
targetStack[depth] = target;
86218608
depth++;
8622-
inferFromProperties(source, target);
8623-
inferFromSignatures(source, target, SignatureKind.Call);
8624-
inferFromSignatures(source, target, SignatureKind.Construct);
8625-
inferFromIndexTypes(source, target);
8609+
inferFromObjectTypes(source, target);
86268610
depth--;
86278611
}
86288612
}
86298613
}
86308614

8615+
function inferFromObjectTypes(source: Type, target: Type) {
8616+
if (getObjectFlags(target) & ObjectFlags.Mapped) {
8617+
const constraintType = getConstraintTypeFromMappedType(<MappedType>target);
8618+
if (getObjectFlags(source) & ObjectFlags.Mapped) {
8619+
inferFromTypes(getConstraintTypeFromMappedType(<MappedType>source), constraintType);
8620+
inferFromTypes(getTemplateTypeFromMappedType(<MappedType>source), getTemplateTypeFromMappedType(<MappedType>target));
8621+
return;
8622+
}
8623+
if (constraintType.flags & TypeFlags.TypeParameter) {
8624+
inferFromTypes(getIndexType(source), constraintType);
8625+
inferFromTypes(getUnionType(map(getPropertiesOfType(source), getTypeOfSymbol)), getTemplateTypeFromMappedType(<MappedType>target));
8626+
return;
8627+
}
8628+
}
8629+
inferFromProperties(source, target);
8630+
inferFromSignatures(source, target, SignatureKind.Call);
8631+
inferFromSignatures(source, target, SignatureKind.Construct);
8632+
inferFromIndexTypes(source, target);
8633+
}
8634+
86318635
function inferFromProperties(source: Type, target: Type) {
86328636
const properties = getPropertiesOfObjectType(target);
86338637
for (const targetProp of properties) {

0 commit comments

Comments
 (0)