Skip to content

Commit

Permalink
fix(50591): RangeError: Maximum call stack size exceeded (#50594)
Browse files Browse the repository at this point in the history
  • Loading branch information
a-tarasyuk committed Sep 20, 2022
1 parent 168186f commit 23746af
Show file tree
Hide file tree
Showing 6 changed files with 92 additions and 1 deletion.
2 changes: 1 addition & 1 deletion src/compiler/checker.ts
Expand Up @@ -23660,7 +23660,7 @@ namespace ts {
}
}

if (hasOnlyExpressionInitializer(declaration)) {
if (hasOnlyExpressionInitializer(declaration) && isBlockScopedNameDeclaredBeforeUse(declaration, node.argumentExpression)) {
const initializer = getEffectiveInitializer(declaration);
return initializer && tryGetNameFromType(getTypeOfExpression(initializer));
}
Expand Down
@@ -0,0 +1,15 @@
tests/cases/compiler/typeGuardNarrowsIndexedAccessOfKnownProperty10.ts(5,6): error TS2448: Block-scoped variable 'id' used before its declaration.


==== tests/cases/compiler/typeGuardNarrowsIndexedAccessOfKnownProperty10.ts (1 errors) ====
interface Foo { bar: any; }
const bar: { [id: string]: number } = {};

(foo: Foo) => {
bar[id]++;
~~
!!! error TS2448: Block-scoped variable 'id' used before its declaration.
!!! related TS2728 tests/cases/compiler/typeGuardNarrowsIndexedAccessOfKnownProperty10.ts:6:8: 'id' is declared here.
const id = foo.bar;
}

@@ -0,0 +1,17 @@
//// [typeGuardNarrowsIndexedAccessOfKnownProperty10.ts]
interface Foo { bar: any; }
const bar: { [id: string]: number } = {};

(foo: Foo) => {
bar[id]++;
const id = foo.bar;
}


//// [typeGuardNarrowsIndexedAccessOfKnownProperty10.js]
"use strict";
var bar = {};
(function (foo) {
bar[id]++;
var id = foo.bar;
});
@@ -0,0 +1,24 @@
=== tests/cases/compiler/typeGuardNarrowsIndexedAccessOfKnownProperty10.ts ===
interface Foo { bar: any; }
>Foo : Symbol(Foo, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty10.ts, 0, 0))
>bar : Symbol(Foo.bar, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty10.ts, 0, 15))

const bar: { [id: string]: number } = {};
>bar : Symbol(bar, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty10.ts, 1, 5))
>id : Symbol(id, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty10.ts, 1, 14))

(foo: Foo) => {
>foo : Symbol(foo, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty10.ts, 3, 1))
>Foo : Symbol(Foo, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty10.ts, 0, 0))

bar[id]++;
>bar : Symbol(bar, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty10.ts, 1, 5))
>id : Symbol(id, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty10.ts, 5, 6))

const id = foo.bar;
>id : Symbol(id, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty10.ts, 5, 6))
>foo.bar : Symbol(Foo.bar, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty10.ts, 0, 15))
>foo : Symbol(foo, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty10.ts, 3, 1))
>bar : Symbol(Foo.bar, Decl(typeGuardNarrowsIndexedAccessOfKnownProperty10.ts, 0, 15))
}

@@ -0,0 +1,26 @@
=== tests/cases/compiler/typeGuardNarrowsIndexedAccessOfKnownProperty10.ts ===
interface Foo { bar: any; }
>bar : any

const bar: { [id: string]: number } = {};
>bar : { [id: string]: number; }
>id : string
>{} : {}

(foo: Foo) => {
>(foo: Foo) => { bar[id]++; const id = foo.bar;} : (foo: Foo) => void
>foo : Foo

bar[id]++;
>bar[id]++ : number
>bar[id] : number
>bar : { [id: string]: number; }
>id : any

const id = foo.bar;
>id : any
>foo.bar : any
>foo : Foo
>bar : any
}

@@ -0,0 +1,9 @@
// @strict: true

interface Foo { bar: any; }
const bar: { [id: string]: number } = {};

(foo: Foo) => {
bar[id]++;
const id = foo.bar;
}

0 comments on commit 23746af

Please sign in to comment.