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

@jakebaileyJake 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 threadtests/baselines/reference/noCrashOnNoLib.errors.txt Outdated
Comment threadsrc/compiler/checker.ts Outdated
@jakebailey
Jake Bailey (jakebailey) marked this pull request as ready for review January 30, 2026 21:31
CopilotAI review requested due to automatic review settings January 30, 2026 21:31

CopilotAI 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
FileDescription
src/compiler/checker.tsChanges iteration semantics selection to depend on presence of Iterable (fallback to array/string iteration when missing).
tests/cases/compiler/arrayIterationLibES5TargetDifferent.tsAdds coverage for for..of behavior under lib=es5 / noLib across targets.
tests/baselines/reference/useObjectValuesAndEntries1(target=es2015).typesUpdates element type inference for for..of when falling back from missing iterator libs.
tests/baselines/reference/useObjectValuesAndEntries1(target=es2015).errors.txtRemoves iterator-missing error now that array fallback applies.
tests/baselines/reference/types.forAwait.es2018.3.errors.txtUpdates diagnostics emitted for for await..of when async iteration types are missing.
tests/baselines/reference/sourceMapValidationDestructuringVariableStatementArrayBindingPatternDefaultValues3(target=es2015).typesBaseline updates due to new iteration/destructuring behavior when iterator libs are missing.
tests/baselines/reference/sourceMapValidationDestructuringVariableStatementArrayBindingPatternDefaultValues3(target=es2015).errors.txtRemoves iterator-missing errors under new fallback behavior.
tests/baselines/reference/sourceMapValidationDestructuringVariableStatementArrayBindingPatternDefaultValues2(target=es2015).errors.txtRemoves iterator-missing errors under new fallback behavior.
tests/baselines/reference/sourceMapValidationDestructuringVariableStatementArrayBindingPatternDefaultValues(target=es2015).errors.txtRemoves iterator-missing errors under new fallback behavior.
tests/baselines/reference/sourceMapValidationDestructuringVariableStatementArrayBindingPattern3(target=es2015).typesBaseline updates due to new iteration/destructuring behavior when iterator libs are missing.
tests/baselines/reference/sourceMapValidationDestructuringVariableStatementArrayBindingPattern3(target=es2015).errors.txtRemoves iterator-missing errors under new fallback behavior.
tests/baselines/reference/sourceMapValidationDestructuringVariableStatementArrayBindingPattern2(target=es2015).errors.txtRemoves iterator-missing errors under new fallback behavior.
tests/baselines/reference/sourceMapValidationDestructuringVariableStatementArrayBindingPattern(target=es2015).errors.txtRemoves iterator-missing errors under new fallback behavior.
tests/baselines/reference/sourceMapValidationDestructuringParametertArrayBindingPatternDefaultValues2(target=es2015).typesBaseline updates due to new iteration/destructuring behavior when iterator libs are missing.
tests/baselines/reference/sourceMapValidationDestructuringParametertArrayBindingPatternDefaultValues2(target=es2015).errors.txtRemoves iterator-missing errors under new fallback behavior.
tests/baselines/reference/sourceMapValidationDestructuringParametertArrayBindingPatternDefaultValues(target=es2015).typesBaseline updates due to new iteration/destructuring behavior when iterator libs are missing.
tests/baselines/reference/sourceMapValidationDestructuringParametertArrayBindingPatternDefaultValues(target=es2015).errors.txtRemoves iterator-missing errors under new fallback behavior.
tests/baselines/reference/sourceMapValidationDestructuringParametertArrayBindingPattern2(target=es2015).typesBaseline updates due to new iteration/destructuring behavior when iterator libs are missing.
tests/baselines/reference/sourceMapValidationDestructuringParametertArrayBindingPattern2(target=es2015).errors.txtRemoves iterator-missing errors under new fallback behavior.
tests/baselines/reference/sourceMapValidationDestructuringParametertArrayBindingPattern(target=es2015).typesBaseline updates due to new iteration/destructuring behavior when iterator libs are missing.
tests/baselines/reference/sourceMapValidationDestructuringParametertArrayBindingPattern(target=es2015).errors.txtRemoves iterator-missing errors under new fallback behavior.
tests/baselines/reference/sourceMapValidationDestructuringForOfObjectBindingPatternDefaultValues2(target=es2015).typesBaseline updates due to new iteration behavior when iterator libs are missing.
tests/baselines/reference/sourceMapValidationDestructuringForOfObjectBindingPatternDefaultValues(target=es2015).typesBaseline updates due to new iteration behavior when iterator libs are missing.
tests/baselines/reference/sourceMapValidationDestructuringForOfObjectBindingPatternDefaultValues(target=es2015).symbolsBaseline symbol changes due to updated binding/typing under fallback iteration.
tests/baselines/reference/sourceMapValidationDestructuringForOfObjectBindingPatternDefaultValues(target=es2015).errors.txtRemoves iterator-missing errors under new fallback behavior.
tests/baselines/reference/sourceMapValidationDestructuringForOfObjectBindingPattern2(target=es2015).typesBaseline updates due to new iteration behavior when iterator libs are missing.
tests/baselines/reference/sourceMapValidationDestructuringForOfObjectBindingPattern2(target=es2015).errors.txtRemoves iterator-missing errors under new fallback behavior.
tests/baselines/reference/sourceMapValidationDestructuringForOfObjectBindingPattern(target=es2015).typesBaseline updates due to new iteration behavior when iterator libs are missing.
tests/baselines/reference/sourceMapValidationDestructuringForOfObjectBindingPattern(target=es2015).symbolsBaseline symbol changes due to updated binding/typing under fallback iteration.
tests/baselines/reference/sourceMapValidationDestructuringForOfObjectBindingPattern(target=es2015).errors.txtRemoves iterator-missing errors under new fallback behavior.
tests/baselines/reference/sourceMapValidationDestructuringForOfArrayBindingPatternDefaultValues2(target=es2015).typesBaseline updates due to new iteration/destructuring behavior when iterator libs are missing.
tests/baselines/reference/sourceMapValidationDestructuringForOfArrayBindingPatternDefaultValues2(target=es2015).errors.txtRemoves iterator-missing errors under new fallback behavior.
tests/baselines/reference/sourceMapValidationDestructuringForOfArrayBindingPatternDefaultValues(target=es2015).errors.txtRemoves iterator-missing errors under new fallback behavior.
tests/baselines/reference/sourceMapValidationDestructuringForOfArrayBindingPattern2(target=es2015).typesBaseline updates due to new iteration/destructuring behavior when iterator libs are missing.
tests/baselines/reference/sourceMapValidationDestructuringForOfArrayBindingPattern2(target=es2015).errors.txtRemoves iterator-missing errors under new fallback behavior.
tests/baselines/reference/sourceMapValidationDestructuringForOfArrayBindingPattern(target=es2015).errors.txtRemoves iterator-missing errors under new fallback behavior.
tests/baselines/reference/sourceMapValidationDestructuringForArrayBindingPatternDefaultValues2(target=es2015).typesBaseline updates due to new iteration/destructuring behavior when iterator libs are missing.
tests/baselines/reference/sourceMapValidationDestructuringForArrayBindingPatternDefaultValues2(target=es2015).errors.txtRemoves iterator-missing errors under new fallback behavior.
tests/baselines/reference/sourceMapValidationDestructuringForArrayBindingPatternDefaultValues(target=es2015).typesBaseline updates due to new iteration/destructuring behavior when iterator libs are missing.
tests/baselines/reference/sourceMapValidationDestructuringForArrayBindingPatternDefaultValues(target=es2015).errors.txtRemoves iterator-missing errors under new fallback behavior.
tests/baselines/reference/sourceMapValidationDestructuringForArrayBindingPattern2(target=es2015).typesBaseline updates due to new iteration/destructuring behavior when iterator libs are missing.
tests/baselines/reference/sourceMapValidationDestructuringForArrayBindingPattern2(target=es2015).errors.txtRemoves iterator-missing errors under new fallback behavior.
tests/baselines/reference/sourceMapValidationDestructuringForArrayBindingPattern(target=es2015).typesBaseline updates due to new iteration/destructuring behavior when iterator libs are missing.
tests/baselines/reference/sourceMapValidationDestructuringForArrayBindingPattern(target=es2015).errors.txtUpdates diagnostics summary due to fallback iteration (iterator-missing errors removed).
tests/baselines/reference/noCrashOnNoLib.errors.txtBaseline updates for changed diagnostic behavior under noLib.
tests/baselines/reference/arrayIterationLibES5TargetDifferent(nolib=true,target=esnext).typesNew baseline for test matrix (types).
tests/baselines/reference/arrayIterationLibES5TargetDifferent(nolib=true,target=esnext).symbolsNew baseline for test matrix (symbols).
tests/baselines/reference/arrayIterationLibES5TargetDifferent(nolib=true,target=esnext).jsNew baseline for test matrix (emit).
tests/baselines/reference/arrayIterationLibES5TargetDifferent(nolib=true,target=esnext).errors.txtNew baseline for test matrix (errors).
tests/baselines/reference/arrayIterationLibES5TargetDifferent(nolib=true,target=es5).typesNew baseline for test matrix (types).
tests/baselines/reference/arrayIterationLibES5TargetDifferent(nolib=true,target=es5).symbolsNew baseline for test matrix (symbols).
tests/baselines/reference/arrayIterationLibES5TargetDifferent(nolib=true,target=es5).jsNew baseline for test matrix (emit).
tests/baselines/reference/arrayIterationLibES5TargetDifferent(nolib=true,target=es5).errors.txtNew baseline for test matrix (errors).
tests/baselines/reference/arrayIterationLibES5TargetDifferent(nolib=true,target=es2015).typesNew baseline for test matrix (types).
tests/baselines/reference/arrayIterationLibES5TargetDifferent(nolib=true,target=es2015).symbolsNew baseline for test matrix (symbols).
tests/baselines/reference/arrayIterationLibES5TargetDifferent(nolib=true,target=es2015).jsNew baseline for test matrix (emit).
tests/baselines/reference/arrayIterationLibES5TargetDifferent(nolib=true,target=es2015).errors.txtNew baseline for test matrix (errors).
tests/baselines/reference/arrayIterationLibES5TargetDifferent(nolib=false,target=esnext).typesNew baseline for test matrix (types).
tests/baselines/reference/arrayIterationLibES5TargetDifferent(nolib=false,target=esnext).symbolsNew baseline for test matrix (symbols).
tests/baselines/reference/arrayIterationLibES5TargetDifferent(nolib=false,target=esnext).jsNew baseline for test matrix (emit).
tests/baselines/reference/arrayIterationLibES5TargetDifferent(nolib=false,target=esnext).errors.txtNew baseline for test matrix (errors).
tests/baselines/reference/arrayIterationLibES5TargetDifferent(nolib=false,target=es5).typesNew baseline for test matrix (types).
tests/baselines/reference/arrayIterationLibES5TargetDifferent(nolib=false,target=es5).symbolsNew baseline for test matrix (symbols).
tests/baselines/reference/arrayIterationLibES5TargetDifferent(nolib=false,target=es5).jsNew baseline for test matrix (emit).
tests/baselines/reference/arrayIterationLibES5TargetDifferent(nolib=false,target=es5).errors.txtNew baseline for test matrix (errors).
tests/baselines/reference/arrayIterationLibES5TargetDifferent(nolib=false,target=es2015).typesNew baseline for test matrix (types).
tests/baselines/reference/arrayIterationLibES5TargetDifferent(nolib=false,target=es2015).symbolsNew baseline for test matrix (symbols).
tests/baselines/reference/arrayIterationLibES5TargetDifferent(nolib=false,target=es2015).jsNew baseline for test matrix (emit).
tests/baselines/reference/arrayIterationLibES5TargetDifferent(nolib=false,target=es2015).errors.txtNew baseline for test matrix (errors).

Comment threadsrc/compiler/checker.ts
@jakebailey
Jake Bailey (jakebailey) added this pull request to the merge queueJan 30, 2026
Merged via the queue into microsoft:main with commit db1fa5cJan 30, 2026
33 checks passed
@jakebailey
Jake Bailey (jakebailey) deleted the iterable-thing branch January 30, 2026 22:54
@microsoftMicrosoft (microsoft) locked as resolved and limited conversation to collaborators Jul 30, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

Author: TeamFor Uncommitted BugPR for untriaged, rejected, closed or missing bug

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@jakebailey@RyanCavanaugh@andrewbranch@typescript-bot