Skip to content

Commit 005d594

Browse files
committed
Fixed a crash related to variadic tuple elements with intersections containing InstantiableNonPrimitive
1 parent 87aa917 commit 005d594

5 files changed

Lines changed: 43 additions & 1 deletion

File tree

src/compiler/checker.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17965,7 +17965,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
1796517965
if (type.flags & TypeFlags.Any) {
1796617966
addElement(type, ElementFlags.Rest, target.labeledElementDeclarations?.[i]);
1796717967
}
17968-
else if (type.flags & TypeFlags.InstantiableNonPrimitive || isGenericMappedType(type)) {
17968+
else if (someContainedType(type, t => !!(t.flags & TypeFlags.InstantiableNonPrimitive) || isGenericMappedType(type))) {
1796917969
// Generic variadic elements stay as they are.
1797017970
addElement(type, ElementFlags.Variadic, target.labeledElementDeclarations?.[i]);
1797117971
}
@@ -28515,6 +28515,10 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
2851528515
return type.flags & TypeFlags.Union ? every((type as UnionType).types, f) : f(type);
2851628516
}
2851728517

28518+
function someContainedType(type: Type, f: (t: Type) => boolean): boolean {
28519+
return type.flags & TypeFlags.UnionOrIntersection ? some((type as UnionOrIntersectionType).types, f) : f(type);
28520+
}
28521+
2851828522
function everyContainedType(type: Type, f: (t: Type) => boolean): boolean {
2851928523
return type.flags & TypeFlags.UnionOrIntersection ? every((type as UnionOrIntersectionType).types, f) : f(type);
2852028524
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
recursiveConditionalCrash5.ts(3,60): error TS2589: Type instantiation is excessively deep and possibly infinite.
2+
3+
4+
==== recursiveConditionalCrash5.ts (1 errors) ====
5+
// https://github.com/microsoft/TypeScript/issues/63040
6+
7+
type StringTreeArrayAsTuple<T> = (T extends [...infer R] ? [...StringTreeArrayAsTuple<R>] : never) & boolean;
8+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
9+
!!! error TS2589: Type instantiation is excessively deep and possibly infinite.
10+
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
//// [tests/cases/compiler/recursiveConditionalCrash5.ts] ////
2+
3+
=== recursiveConditionalCrash5.ts ===
4+
// https://github.com/microsoft/TypeScript/issues/63040
5+
6+
type StringTreeArrayAsTuple<T> = (T extends [...infer R] ? [...StringTreeArrayAsTuple<R>] : never) & boolean;
7+
>StringTreeArrayAsTuple : Symbol(StringTreeArrayAsTuple, Decl(recursiveConditionalCrash5.ts, 0, 0))
8+
>T : Symbol(T, Decl(recursiveConditionalCrash5.ts, 2, 28))
9+
>T : Symbol(T, Decl(recursiveConditionalCrash5.ts, 2, 28))
10+
>R : Symbol(R, Decl(recursiveConditionalCrash5.ts, 2, 53))
11+
>StringTreeArrayAsTuple : Symbol(StringTreeArrayAsTuple, Decl(recursiveConditionalCrash5.ts, 0, 0))
12+
>R : Symbol(R, Decl(recursiveConditionalCrash5.ts, 2, 53))
13+
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
//// [tests/cases/compiler/recursiveConditionalCrash5.ts] ////
2+
3+
=== recursiveConditionalCrash5.ts ===
4+
// https://github.com/microsoft/TypeScript/issues/63040
5+
6+
type StringTreeArrayAsTuple<T> = (T extends [...infer R] ? [...StringTreeArrayAsTuple<R>] : never) & boolean;
7+
>StringTreeArrayAsTuple : StringTreeArrayAsTuple<T>
8+
> : ^^^^^^^^^^^^^^^^^^^^^^^^^
9+
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
// @strict: true
2+
// @noEmit: true
3+
4+
// https://github.com/microsoft/TypeScript/issues/63040
5+
6+
type StringTreeArrayAsTuple<T> = (T extends [...infer R] ? [...StringTreeArrayAsTuple<R>] : never) & boolean;

0 commit comments

Comments
 (0)