fix(50591): RangeError: Maximum call stack size exceeded (#50594)

This commit is contained in:
Oleksandr T 2022-09-20 21:03:18 +03:00 committed by GitHub
parent 168186f93d
commit 23746af766
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 92 additions and 1 deletions

View File

@ -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));
}

View File

@ -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;
}

View File

@ -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;
});

View File

@ -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))
}

View File

@ -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
}

View File

@ -0,0 +1,9 @@
// @strict: true
interface Foo { bar: any; }
const bar: { [id: string]: number } = {};
(foo: Foo) => {
bar[id]++;
const id = foo.bar;
}