diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index ce644034b9c3b..82d1ab321f2b9 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -11896,6 +11896,9 @@ namespace ts { else if ((type as MappedType).objectFlags & ObjectFlags.Mapped) { resolveMappedTypeMembers(type as MappedType); } + else { + Debug.fail("Unhandled object type " + Debug.formatObjectFlags(type.objectFlags)); + } } else if (type.flags & TypeFlags.Union) { resolveUnionTypeMembers(type as UnionType); @@ -11903,6 +11906,9 @@ namespace ts { else if (type.flags & TypeFlags.Intersection) { resolveIntersectionTypeMembers(type as IntersectionType); } + else { + Debug.fail("Unhandled type " + Debug.formatTypeFlags(type.flags)); + } } return type as ResolvedType; } @@ -24613,7 +24619,7 @@ namespace ts { } // for (const _ in ref) acts as a nonnull on ref if (isVariableDeclaration(node) && node.parent.parent.kind === SyntaxKind.ForInStatement && isMatchingReference(reference, node.parent.parent.expression)) { - return getNonNullableTypeIfNeeded(getTypeFromFlowType(getTypeAtFlowNode(flow.antecedent))); + return getNonNullableTypeIfNeeded(finalizeEvolvingArrayType(getTypeFromFlowType(getTypeAtFlowNode(flow.antecedent)))); } // Assignment doesn't affect reference return undefined; diff --git a/tests/baselines/reference/evolvingArrayResolvedAssert.errors.txt b/tests/baselines/reference/evolvingArrayResolvedAssert.errors.txt new file mode 100644 index 0000000000000..487ffa3a82a12 --- /dev/null +++ b/tests/baselines/reference/evolvingArrayResolvedAssert.errors.txt @@ -0,0 +1,18 @@ +tests/cases/compiler/evolvingArrayResolvedAssert.ts(1,5): error TS7034: Variable 'C' implicitly has type 'any[]' in some locations where its type cannot be determined. +tests/cases/compiler/evolvingArrayResolvedAssert.ts(2,15): error TS7005: Variable 'C' implicitly has an 'any[]' type. +tests/cases/compiler/evolvingArrayResolvedAssert.ts(3,9): error TS7005: Variable 'C' implicitly has an 'any[]' type. + + +==== tests/cases/compiler/evolvingArrayResolvedAssert.ts (3 errors) ==== + var C = []; + ~ +!!! error TS7034: Variable 'C' implicitly has type 'any[]' in some locations where its type cannot be determined. + for (var a in C) { + ~ +!!! error TS7005: Variable 'C' implicitly has an 'any[]' type. + if (C.hasOwnProperty(a)) { + ~ +!!! error TS7005: Variable 'C' implicitly has an 'any[]' type. + } + } + \ No newline at end of file diff --git a/tests/baselines/reference/evolvingArrayResolvedAssert.js b/tests/baselines/reference/evolvingArrayResolvedAssert.js new file mode 100644 index 0000000000000..4cae93bbb8645 --- /dev/null +++ b/tests/baselines/reference/evolvingArrayResolvedAssert.js @@ -0,0 +1,15 @@ +//// [evolvingArrayResolvedAssert.ts] +var C = []; +for (var a in C) { + if (C.hasOwnProperty(a)) { + } +} + + +//// [evolvingArrayResolvedAssert.js] +"use strict"; +var C = []; +for (var a in C) { + if (C.hasOwnProperty(a)) { + } +} diff --git a/tests/baselines/reference/evolvingArrayResolvedAssert.symbols b/tests/baselines/reference/evolvingArrayResolvedAssert.symbols new file mode 100644 index 0000000000000..8d52f9e5d0266 --- /dev/null +++ b/tests/baselines/reference/evolvingArrayResolvedAssert.symbols @@ -0,0 +1,16 @@ +=== tests/cases/compiler/evolvingArrayResolvedAssert.ts === +var C = []; +>C : Symbol(C, Decl(evolvingArrayResolvedAssert.ts, 0, 3)) + +for (var a in C) { +>a : Symbol(a, Decl(evolvingArrayResolvedAssert.ts, 1, 8)) +>C : Symbol(C, Decl(evolvingArrayResolvedAssert.ts, 0, 3)) + + if (C.hasOwnProperty(a)) { +>C.hasOwnProperty : Symbol(Object.hasOwnProperty, Decl(lib.es5.d.ts, --, --)) +>C : Symbol(C, Decl(evolvingArrayResolvedAssert.ts, 0, 3)) +>hasOwnProperty : Symbol(Object.hasOwnProperty, Decl(lib.es5.d.ts, --, --)) +>a : Symbol(a, Decl(evolvingArrayResolvedAssert.ts, 1, 8)) + } +} + diff --git a/tests/baselines/reference/evolvingArrayResolvedAssert.types b/tests/baselines/reference/evolvingArrayResolvedAssert.types new file mode 100644 index 0000000000000..b0524c275c117 --- /dev/null +++ b/tests/baselines/reference/evolvingArrayResolvedAssert.types @@ -0,0 +1,18 @@ +=== tests/cases/compiler/evolvingArrayResolvedAssert.ts === +var C = []; +>C : any[] +>[] : never[] + +for (var a in C) { +>a : string +>C : any[] + + if (C.hasOwnProperty(a)) { +>C.hasOwnProperty(a) : boolean +>C.hasOwnProperty : (v: PropertyKey) => boolean +>C : any[] +>hasOwnProperty : (v: PropertyKey) => boolean +>a : string + } +} + diff --git a/tests/cases/compiler/evolvingArrayResolvedAssert.ts b/tests/cases/compiler/evolvingArrayResolvedAssert.ts new file mode 100644 index 0000000000000..7ba37947b0414 --- /dev/null +++ b/tests/cases/compiler/evolvingArrayResolvedAssert.ts @@ -0,0 +1,7 @@ +// @strict: true + +var C = []; +for (var a in C) { + if (C.hasOwnProperty(a)) { + } +}