Skip to content

Be more lenient about iteration when lib=es5 / noLib - #63070

Merged
Jake Bailey (jakebailey) merged 3 commits into
microsoft:mainfrom
jakebailey:iterable-thing
Jan 30, 2026
Merged

Be more lenient about iteration when lib=es5 / noLib#63070
Jake Bailey (jakebailey) merged 3 commits into
microsoft:mainfrom
jakebailey:iterable-thing

Conversation

@jakebailey

@jakebailey Jake Bailey (jakebailey) commented Jan 30, 2026

Copy link
Copy Markdown
Member

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.

Comment thread tests/baselines/reference/noCrashOnNoLib.errors.txt Outdated
Comment thread src/compiler/checker.ts Outdated
@jakebailey
Jake Bailey (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

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

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).

Comment thread src/compiler/checker.ts
@jakebailey
Jake Bailey (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
Jake Bailey (jakebailey) deleted the iterable-thing branch January 30, 2026 22:54
@microsoft Microsoft (microsoft) locked as resolved and limited conversation to collaborators Jul 30, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

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.

5 participants