Skip to content

Conversation

@jakebailey
Copy link
Member

@jakebailey jakebailey commented Jan 30, 2026

When lib=es5 or noLib, but the target is ES2015+, we issue errors on iterations complaining that [Symbol.iterator]() is missing. Which is impossible, because there's no lib.

See these breaks: #63067 (comment)

But, we already know how to handle iteration when target is ES5 and there's no iteration libs; we just say "okay, you can iterate over arrays and strings".

This PR tweaks things so that we more or less fall back to ES5-ish behavior when the iterator types are missing, re-allowing iteration on arrays/strings (when Array exists; in noLib, things are universally weird) but preventing other kinds of iterations.

This is not dissimilar to us allowing async/await to work when Promise libs are missing.

@typescript-bot typescript-bot added Author: Team For Uncommitted Bug PR for untriaged, rejected, closed or missing bug labels Jan 30, 2026
@jakebailey jakebailey marked this pull request as ready for review January 30, 2026 21:31
Copilot AI review requested due to automatic review settings January 30, 2026 21:31
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adjusts TypeScript’s iteration type-checking so that when iterator/Iterable types are unavailable (e.g. lib=es5 or noLib) but target is ES2015+, the checker falls back to ES5-style “array/string-only” iteration rules instead of emitting [Symbol.iterator]-missing errors.

Changes:

  • Gate “uplevel iteration” semantics on the presence of the global Iterable type; otherwise fall back to array/string handling.
  • Add a compiler test matrix covering lib=es5 vs noLib and multiple target values for for..of iteration.
  • Update reference baselines to reflect the new iteration behavior (fewer TS2488/TS2504 iterator errors; more ES5-style diagnostics and improved element typing).

Reviewed changes

Copilot reviewed 72 out of 72 changed files in this pull request and generated 1 comment.

Show a summary per file
File Description
src/compiler/checker.ts Changes iteration semantics selection to depend on presence of Iterable (fallback to array/string iteration when missing).
tests/cases/compiler/arrayIterationLibES5TargetDifferent.ts Adds coverage for for..of behavior under lib=es5 / noLib across targets.
tests/baselines/reference/useObjectValuesAndEntries1(target=es2015).types Updates element type inference for for..of when falling back from missing iterator libs.
tests/baselines/reference/useObjectValuesAndEntries1(target=es2015).errors.txt Removes iterator-missing error now that array fallback applies.
tests/baselines/reference/types.forAwait.es2018.3.errors.txt Updates diagnostics emitted for for await..of when async iteration types are missing.
tests/baselines/reference/sourceMapValidationDestructuringVariableStatementArrayBindingPatternDefaultValues3(target=es2015).types Baseline updates due to new iteration/destructuring behavior when iterator libs are missing.
tests/baselines/reference/sourceMapValidationDestructuringVariableStatementArrayBindingPatternDefaultValues3(target=es2015).errors.txt Removes iterator-missing errors under new fallback behavior.
tests/baselines/reference/sourceMapValidationDestructuringVariableStatementArrayBindingPatternDefaultValues2(target=es2015).errors.txt Removes iterator-missing errors under new fallback behavior.
tests/baselines/reference/sourceMapValidationDestructuringVariableStatementArrayBindingPatternDefaultValues(target=es2015).errors.txt Removes iterator-missing errors under new fallback behavior.
tests/baselines/reference/sourceMapValidationDestructuringVariableStatementArrayBindingPattern3(target=es2015).types Baseline updates due to new iteration/destructuring behavior when iterator libs are missing.
tests/baselines/reference/sourceMapValidationDestructuringVariableStatementArrayBindingPattern3(target=es2015).errors.txt Removes iterator-missing errors under new fallback behavior.
tests/baselines/reference/sourceMapValidationDestructuringVariableStatementArrayBindingPattern2(target=es2015).errors.txt Removes iterator-missing errors under new fallback behavior.
tests/baselines/reference/sourceMapValidationDestructuringVariableStatementArrayBindingPattern(target=es2015).errors.txt Removes iterator-missing errors under new fallback behavior.
tests/baselines/reference/sourceMapValidationDestructuringParametertArrayBindingPatternDefaultValues2(target=es2015).types Baseline updates due to new iteration/destructuring behavior when iterator libs are missing.
tests/baselines/reference/sourceMapValidationDestructuringParametertArrayBindingPatternDefaultValues2(target=es2015).errors.txt Removes iterator-missing errors under new fallback behavior.
tests/baselines/reference/sourceMapValidationDestructuringParametertArrayBindingPatternDefaultValues(target=es2015).types Baseline updates due to new iteration/destructuring behavior when iterator libs are missing.
tests/baselines/reference/sourceMapValidationDestructuringParametertArrayBindingPatternDefaultValues(target=es2015).errors.txt Removes iterator-missing errors under new fallback behavior.
tests/baselines/reference/sourceMapValidationDestructuringParametertArrayBindingPattern2(target=es2015).types Baseline updates due to new iteration/destructuring behavior when iterator libs are missing.
tests/baselines/reference/sourceMapValidationDestructuringParametertArrayBindingPattern2(target=es2015).errors.txt Removes iterator-missing errors under new fallback behavior.
tests/baselines/reference/sourceMapValidationDestructuringParametertArrayBindingPattern(target=es2015).types Baseline updates due to new iteration/destructuring behavior when iterator libs are missing.
tests/baselines/reference/sourceMapValidationDestructuringParametertArrayBindingPattern(target=es2015).errors.txt Removes iterator-missing errors under new fallback behavior.
tests/baselines/reference/sourceMapValidationDestructuringForOfObjectBindingPatternDefaultValues2(target=es2015).types Baseline updates due to new iteration behavior when iterator libs are missing.
tests/baselines/reference/sourceMapValidationDestructuringForOfObjectBindingPatternDefaultValues(target=es2015).types Baseline updates due to new iteration behavior when iterator libs are missing.
tests/baselines/reference/sourceMapValidationDestructuringForOfObjectBindingPatternDefaultValues(target=es2015).symbols Baseline symbol changes due to updated binding/typing under fallback iteration.
tests/baselines/reference/sourceMapValidationDestructuringForOfObjectBindingPatternDefaultValues(target=es2015).errors.txt Removes iterator-missing errors under new fallback behavior.
tests/baselines/reference/sourceMapValidationDestructuringForOfObjectBindingPattern2(target=es2015).types Baseline updates due to new iteration behavior when iterator libs are missing.
tests/baselines/reference/sourceMapValidationDestructuringForOfObjectBindingPattern2(target=es2015).errors.txt Removes iterator-missing errors under new fallback behavior.
tests/baselines/reference/sourceMapValidationDestructuringForOfObjectBindingPattern(target=es2015).types Baseline updates due to new iteration behavior when iterator libs are missing.
tests/baselines/reference/sourceMapValidationDestructuringForOfObjectBindingPattern(target=es2015).symbols Baseline symbol changes due to updated binding/typing under fallback iteration.
tests/baselines/reference/sourceMapValidationDestructuringForOfObjectBindingPattern(target=es2015).errors.txt Removes iterator-missing errors under new fallback behavior.
tests/baselines/reference/sourceMapValidationDestructuringForOfArrayBindingPatternDefaultValues2(target=es2015).types Baseline updates due to new iteration/destructuring behavior when iterator libs are missing.
tests/baselines/reference/sourceMapValidationDestructuringForOfArrayBindingPatternDefaultValues2(target=es2015).errors.txt Removes iterator-missing errors under new fallback behavior.
tests/baselines/reference/sourceMapValidationDestructuringForOfArrayBindingPatternDefaultValues(target=es2015).errors.txt Removes iterator-missing errors under new fallback behavior.
tests/baselines/reference/sourceMapValidationDestructuringForOfArrayBindingPattern2(target=es2015).types Baseline updates due to new iteration/destructuring behavior when iterator libs are missing.
tests/baselines/reference/sourceMapValidationDestructuringForOfArrayBindingPattern2(target=es2015).errors.txt Removes iterator-missing errors under new fallback behavior.
tests/baselines/reference/sourceMapValidationDestructuringForOfArrayBindingPattern(target=es2015).errors.txt Removes iterator-missing errors under new fallback behavior.
tests/baselines/reference/sourceMapValidationDestructuringForArrayBindingPatternDefaultValues2(target=es2015).types Baseline updates due to new iteration/destructuring behavior when iterator libs are missing.
tests/baselines/reference/sourceMapValidationDestructuringForArrayBindingPatternDefaultValues2(target=es2015).errors.txt Removes iterator-missing errors under new fallback behavior.
tests/baselines/reference/sourceMapValidationDestructuringForArrayBindingPatternDefaultValues(target=es2015).types Baseline updates due to new iteration/destructuring behavior when iterator libs are missing.
tests/baselines/reference/sourceMapValidationDestructuringForArrayBindingPatternDefaultValues(target=es2015).errors.txt Removes iterator-missing errors under new fallback behavior.
tests/baselines/reference/sourceMapValidationDestructuringForArrayBindingPattern2(target=es2015).types Baseline updates due to new iteration/destructuring behavior when iterator libs are missing.
tests/baselines/reference/sourceMapValidationDestructuringForArrayBindingPattern2(target=es2015).errors.txt Removes iterator-missing errors under new fallback behavior.
tests/baselines/reference/sourceMapValidationDestructuringForArrayBindingPattern(target=es2015).types Baseline updates due to new iteration/destructuring behavior when iterator libs are missing.
tests/baselines/reference/sourceMapValidationDestructuringForArrayBindingPattern(target=es2015).errors.txt Updates diagnostics summary due to fallback iteration (iterator-missing errors removed).
tests/baselines/reference/noCrashOnNoLib.errors.txt Baseline updates for changed diagnostic behavior under noLib.
tests/baselines/reference/arrayIterationLibES5TargetDifferent(nolib=true,target=esnext).types New baseline for test matrix (types).
tests/baselines/reference/arrayIterationLibES5TargetDifferent(nolib=true,target=esnext).symbols New baseline for test matrix (symbols).
tests/baselines/reference/arrayIterationLibES5TargetDifferent(nolib=true,target=esnext).js New baseline for test matrix (emit).
tests/baselines/reference/arrayIterationLibES5TargetDifferent(nolib=true,target=esnext).errors.txt New baseline for test matrix (errors).
tests/baselines/reference/arrayIterationLibES5TargetDifferent(nolib=true,target=es5).types New baseline for test matrix (types).
tests/baselines/reference/arrayIterationLibES5TargetDifferent(nolib=true,target=es5).symbols New baseline for test matrix (symbols).
tests/baselines/reference/arrayIterationLibES5TargetDifferent(nolib=true,target=es5).js New baseline for test matrix (emit).
tests/baselines/reference/arrayIterationLibES5TargetDifferent(nolib=true,target=es5).errors.txt New baseline for test matrix (errors).
tests/baselines/reference/arrayIterationLibES5TargetDifferent(nolib=true,target=es2015).types New baseline for test matrix (types).
tests/baselines/reference/arrayIterationLibES5TargetDifferent(nolib=true,target=es2015).symbols New baseline for test matrix (symbols).
tests/baselines/reference/arrayIterationLibES5TargetDifferent(nolib=true,target=es2015).js New baseline for test matrix (emit).
tests/baselines/reference/arrayIterationLibES5TargetDifferent(nolib=true,target=es2015).errors.txt New baseline for test matrix (errors).
tests/baselines/reference/arrayIterationLibES5TargetDifferent(nolib=false,target=esnext).types New baseline for test matrix (types).
tests/baselines/reference/arrayIterationLibES5TargetDifferent(nolib=false,target=esnext).symbols New baseline for test matrix (symbols).
tests/baselines/reference/arrayIterationLibES5TargetDifferent(nolib=false,target=esnext).js New baseline for test matrix (emit).
tests/baselines/reference/arrayIterationLibES5TargetDifferent(nolib=false,target=esnext).errors.txt New baseline for test matrix (errors).
tests/baselines/reference/arrayIterationLibES5TargetDifferent(nolib=false,target=es5).types New baseline for test matrix (types).
tests/baselines/reference/arrayIterationLibES5TargetDifferent(nolib=false,target=es5).symbols New baseline for test matrix (symbols).
tests/baselines/reference/arrayIterationLibES5TargetDifferent(nolib=false,target=es5).js New baseline for test matrix (emit).
tests/baselines/reference/arrayIterationLibES5TargetDifferent(nolib=false,target=es5).errors.txt New baseline for test matrix (errors).
tests/baselines/reference/arrayIterationLibES5TargetDifferent(nolib=false,target=es2015).types New baseline for test matrix (types).
tests/baselines/reference/arrayIterationLibES5TargetDifferent(nolib=false,target=es2015).symbols New baseline for test matrix (symbols).
tests/baselines/reference/arrayIterationLibES5TargetDifferent(nolib=false,target=es2015).js New baseline for test matrix (emit).
tests/baselines/reference/arrayIterationLibES5TargetDifferent(nolib=false,target=es2015).errors.txt New baseline for test matrix (errors).

@jakebailey jakebailey enabled auto-merge January 30, 2026 22:32
@jakebailey jakebailey added this pull request to the merge queue Jan 30, 2026
Merged via the queue into microsoft:main with commit db1fa5c Jan 30, 2026
33 checks passed
@jakebailey jakebailey deleted the iterable-thing branch January 30, 2026 22:54
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Author: Team For Uncommitted Bug PR for untriaged, rejected, closed or missing bug

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants