Skip to content

Commit 417f154

Browse files
committed
Reinstate conservative constraint logic
1 parent ee429dd commit 417f154

File tree

1 file changed

+6
-1
lines changed

1 file changed

+6
-1
lines changed

src/compiler/checker.ts

+6-1
Original file line numberDiff line numberDiff line change
@@ -13841,7 +13841,12 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
1384113841
return getBaseConstraint(getSubstitutionIntersection(t as SubstitutionType));
1384213842
}
1384313843
if (isGenericTupleType(t)) {
13844-
const newElements = map(getElementTypes(t), (v, i) => t.target.elementFlags[i] & ElementFlags.Variadic && getBaseConstraint(v) || v);
13844+
// We substitute constraints for variadic elements only when the constraints are array types or
13845+
// non-variadic tuple types as we want to avoid further (possibly unbounded) recursion.
13846+
const newElements = map(getElementTypes(t), (v, i) => {
13847+
const constraint = t.target.elementFlags[i] & ElementFlags.Variadic && getBaseConstraint(v) || v;
13848+
return constraint && everyType(constraint, c => isArrayOrTupleType(c) && !isGenericTupleType(c)) ? constraint : v;
13849+
});
1384513850
return createTupleType(newElements, t.target.elementFlags, t.target.readonly, t.target.labeledElementDeclarations);
1384613851
}
1384713852
return t;

0 commit comments

Comments
 (0)