e9ead2bc09
A structural directive can specify a template guard for an input, such that the type of that input's binding can be narrowed based on the guard's return type. Previously, such template guards could only be methods, of which an invocation would be inserted into the type-check block (TCB). For `NgIf`, the template guard narrowed the type of its expression to be `NonNullable` using the following declaration: ```typescript export declare class NgIf { static ngTemplateGuard_ngIf<E>(dir: NgIf, expr: E): expr is NonNullable<E> } ``` This works fine for usages such as `*ngIf="person"` but starts to introduce false-positives when e.g. an explicit non-null check like `*ngIf="person !== null"` is used, as the method invocation in the TCB would not have the desired effect of narrowing `person` to become non-nullable: ```typescript if (NgIf.ngTemplateGuard_ngIf(directive, ctx.person !== null)) { // Usages of `ctx.person` within this block would // not have been narrowed to be non-nullable. } ``` This commit introduces a new strategy for template guards to allow for the binding expression itself to be used as template guard in the TCB. Now, the TCB generated for `*ngIf="person !== null"` would look as follows: ```typescript if (ctx.person !== null) { // This time `ctx.person` will successfully have // been narrowed to be non-nullable. } ``` This strategy can be activated by declaring the template guard as a property declaration with `'binding'` as literal return type. See #30235 for an example where this led to a false positive. PR Close #30248 |
||
---|---|---|
.buildkite | ||
.circleci | ||
.codefresh | ||
.github | ||
.vscode | ||
aio | ||
docs | ||
integration | ||
modules | ||
packages | ||
scripts | ||
third_party | ||
tools | ||
.bazelignore | ||
.bazelrc | ||
.clang-format | ||
.editorconfig | ||
.gitattributes | ||
.gitignore | ||
.mailmap | ||
.nvmrc | ||
BUILD.bazel | ||
CHANGELOG.md | ||
CODE_OF_CONDUCT.md | ||
CONTRIBUTING.md | ||
LICENSE | ||
README.md | ||
WORKSPACE | ||
browser-providers.conf.js | ||
gulpfile.js | ||
karma-js.conf.js | ||
package.json | ||
protractor-perf.conf.js | ||
renovate.json | ||
shims_for_IE.js | ||
test-events.js | ||
test-main.js | ||
tslint.json | ||
yarn.lock | ||
yarn.lock.readme.md |
README.md
Angular
Angular is a development platform for building mobile and desktop web applications using Typescript/JavaScript and other languages.
Quickstart
Changelog
Learn about the latest improvements.
Want to help?
Want to file a bug, contribute some code, or improve documentation? Excellent! Read up on our guidelines for contributing and then check out one of our issues in the hotlist: community-help.