Go to file
Alex Rickabaugh f1269d98dc feat(ivy): input type coercion for template type-checking (#33243)
Often the types of an `@Input`'s field don't fully reflect the types of
assignable values. This can happen when an input has a getter/setter pair
where the getter always returns a narrow type, and the setter coerces a
wider value down to the narrow type.

For example, you could imagine an input of the form:

```typescript
@Input() get value(): string {
  return this._value;
}

set value(v: {toString(): string}) {
  this._value = v.toString();
}
```

Here, the getter always returns a `string`, but the setter accepts any value
that can be `toString()`'d, and coerces it to a string.

Unfortunately TypeScript does not actually support this syntax, and so
Angular users are forced to type their setters as narrowly as the getters,
even though at runtime the coercion works just fine.

To support these kinds of patterns (e.g. as used by Material), this commit
adds a compiler feature called "input coercion". When a binding is made to
the 'value' input of a directive like MatInput, the compiler will look for a
static field with the name ngAcceptInputType_value. If such a field is found
the type-checking expression for the input will use the static field's type
instead of the type for the @Input field,allowing for the expression of a
type conversion between the binding expression and the value being written
to the input's field.

To solve the case above, for example, MatInput might write:

```typescript
class MatInput {
  // rest of the directive...

  static ngAcceptInputType_value: {toString(): string};
}
```

FW-1475 #resolve

PR Close #33243
2019-10-24 09:49:38 -07:00
.circleci build: use http caching on windows CI runs (#33298) 2019-10-22 13:09:28 -04:00
.devcontainer build: add recommended config files for VSCode remote development (#30450) 2019-05-20 10:13:53 -07:00
.github docs: add migrating to version 9 guide (#33339) 2019-10-23 09:11:40 -07:00
.vscode build: add recommended config files for VSCode remote development (#30450) 2019-05-20 10:13:53 -07:00
aio feat(ivy): input type coercion for template type-checking (#33243) 2019-10-24 09:49:38 -07:00
docs build: address comments, restructure setup-rbe.sh script (#33109) 2019-10-21 15:56:52 -04:00
integration test: fix typo in cli e2e descriptions (#33175) 2019-10-21 15:54:06 -04:00
modules test: clean up explicit dynamic query usages (#33015) 2019-10-17 16:10:10 -04:00
packages feat(ivy): input type coercion for template type-checking (#33243) 2019-10-24 09:49:38 -07:00
scripts build: address comments, restructure setup-rbe.sh script (#33109) 2019-10-21 15:56:52 -04:00
third_party build: bump yarn requirement to 1.17.3 (#32344) 2019-08-28 17:13:05 -07:00
tools refactor(core): deprecate entryComponents (#33205) 2019-10-18 16:29:23 -04:00
.bazelignore build: update to rules_nodejs 0.32.2 (#31325) 2019-07-01 14:16:42 -07:00
.bazelrc build: address comments, restructure setup-rbe.sh script (#33109) 2019-10-21 15:56:52 -04:00
.clang-format feat(tooling): Add a .clang-format for automated JavaScript formatting. 2015-04-02 08:44:34 -07:00
.editorconfig build: use https link to editorconfig.org in .editorconfig (#27664) 2018-12-18 09:30:09 -08:00
.gitattributes test: fix ts api guardian and public guard tests on windows (#30105) 2019-04-26 16:32:22 -07:00
.gitignore test: Add script which allows running all of the profiling tests and compare results (#33186) 2019-10-16 10:22:30 -04:00
.mailmap build: add a Git .mailmap with my new name (#19550) 2017-10-09 14:35:30 -07:00
.nvmrc build: update .nvmrc file to correct node version (#25992) 2018-09-18 13:11:58 -07:00
BUILD.bazel build: update to rules_nodejs 0.32.2 (#31325) 2019-07-01 14:16:42 -07:00
CHANGELOG.md release: cut the v9.0.0-next.13 release 2019-10-23 16:00:42 -07:00
CODE_OF_CONDUCT.md docs: fix community tab in GitHub by copying CoC 2018-02-27 19:02:30 -08:00
CONTRIBUTING.md docs: add missing parenthesis (#31041) 2019-10-07 11:02:33 -07:00
LICENSE build: bump year (#27880) 2019-01-11 11:15:59 -08:00
README.md docs: fix typo of Typescript to TypeScript (#32153) 2019-08-15 12:44:41 -07:00
WORKSPACE build: update to nodejs rules 0.38.3 (#33073) 2019-10-14 20:25:57 +00:00
browser-providers.conf.js ci: re-enable chrome mobile tests on android (#32447) 2019-09-03 11:58:30 -07:00
gulpfile.js build(zone.js): add changelog gulptask for zone.js (#31852) 2019-07-26 11:30:08 -07:00
karma-js.conf.js feat(ivy): support ng-add in localize package (#32791) 2019-09-27 13:15:02 -07:00
package.json release: cut the v9.0.0-next.13 release 2019-10-23 16:00:42 -07:00
protractor-perf.conf.js fixup! test(ivy): make the test run with benchpress (#30449) 2019-05-16 20:04:04 -07:00
renovate.json ci: update packageFiles to be renovated (#29071) 2019-03-05 09:43:23 -08:00
shims_for_IE.js Revert "refactor: add license header to JS files & format files (#12035)" 2016-10-04 14:06:41 -07:00
test-events.js refactor: rename unpatched event flag in Zone from `BLACK_LISTED_EVENTS` to `UNPATCHED_EVENTS` (#29617) 2019-10-04 08:44:58 -07:00
test-main.js feat(ivy): i18n - implement compile-time inlining (#32881) 2019-10-09 13:19:38 -07:00
tslint.json style: enforce disallowance of String, Number and Boolean constructors (#33210) 2019-10-17 14:12:00 -04:00
yarn.lock build: fix gulp setup not working with node v12 (#33348) 2019-10-23 09:16:20 -07:00
yarn.lock.readme.md build: remove travisci leftovers (#27979) 2019-01-09 10:41:16 -08:00

README.md

CircleCI BrowserStack Status Join the chat at https://gitter.im/angular/angular npm version

Angular

Angular is a development platform for building mobile and desktop web applications using TypeScript/JavaScript and other languages.

Quickstart

Get started in 5 minutes.

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.