fix(core): make QueryList implement Iterable in the type system (#33536)

Originally, QueryList implemented Iterable and provided a Symbol.iterator
on its prototype. This caused issues with tree-shaking, so QueryList was
refactored and the Symbol.iterator added in its constructor instead. As
part of this change, QueryList no longer implemented Iterable directly.

Unfortunately, this meant that QueryList was no longer assignable to
Iterable or, consequently, NgIterable. NgIterable is used for NgFor's input,
so this meant that QueryList was not usable (in a type sense) for NgFor
iteration. View Engine's template type checking would not catch this, but
Ivy's did.

As a fix, this commit adds the declaration (but not the implementation) of
the Symbol.iterator function back to QueryList. This has no runtime effect,
so it doesn't affect tree-shaking of QueryList, but it ensures that
QueryList is assignable to NgIterable and thus usable with NgFor.

Fixes #29842

PR Close #33536
This commit is contained in:
Alex Rickabaugh
2019-11-01 12:31:56 -07:00
parent 850aee2448
commit bb290cefae
6 changed files with 57 additions and 5 deletions

View File

@ -1136,7 +1136,8 @@ export interface Query {
export declare abstract class Query {
}
export declare class QueryList<T> {
export declare class QueryList<T> implements Iterable<T> {
[Symbol.iterator]: () => Iterator<T>;
readonly changes: Observable<any>;
readonly dirty = true;
readonly first: T;