-
Notifications
You must be signed in to change notification settings - Fork 13.2k
Be more lenient about iteration when lib=es5 / noLib
#63070
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
...s/reference/sourceMapValidationDestructuringForArrayBindingPattern(target=es2015).errors.txt
Show resolved
Hide resolved
There was a problem hiding this 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
Iterabletype; otherwise fall back to array/string handling. - Add a compiler test matrix covering
lib=es5vsnoLiband multipletargetvalues forfor..ofiteration. - 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). |
When
lib=es5ornoLib, but thetargetis 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
Arrayexists; innoLib, things are universally weird) but preventing other kinds of iterations.This is not dissimilar to us allowing async/await to work when
Promiselibs are missing.