angular/packages/compiler-cli/test/ngtsc
JoostK 7525f3afc1 fix(compiler-cli): type-check inputs that include undefined when there's coercion members (#38273)
For attribute bindings that target a directive's input, the template
type checker is able to verify that the type of the input expression is
compatible with the directive's declaration for said input. This
checking adheres to the `strictNullChecks` flag as configured in the
TypeScript compilation, such that errors are reported for expressions
that include `undefined` or `null` in their type if the input's
declaration does not include those types.

There was a bug with this level of type-checking for directives that
also declare coercion members, where binding an expression that includes
the `undefined` type to a directive's input that does not include the
`undefined` type would not be reported as error.

This commit fixes the bug by changing the type-constructor in type-check
code to use an intersection type of regular inputs and coerced inputs,
instead of a union type. The union type would inadvertently allow
`undefined` types to be assigned into the regular inputs, as that would
still satisfy the characteristics of a union type.

As a result of this change, you may start to see build failures if
`strictTemplates` is enabled and `strictInputTypes` is not disabled.
These errors are legitimate and some action is required to achieve a
successful build:

1. Update the templates for which an error is reported and introduce the
   non-null assertion operator at the end of the expression. This
   removes the `undefined` type from the expression's type, making it
   appear as a valid assignment.
2. Disable `strictNullInputTypes` in the compiler options. This will
   implicitly add the non-null assertion operators similar to option 1,
   but all templates in the compilation are affected.
3. Update the directive's input declaration to include the `undefined`
   type, if the directive is not implemented in an external library.

PR Close #38273
2020-08-06 15:21:02 -07:00
..
fake_core Revert "fix(compiler): mark NgModuleFactory construction as not side effectful (#38147)" (#38303) 2020-07-30 12:19:35 -07:00
BUILD.bazel perf(compiler-cli): fix regressions in incremental program reuse (#37641) 2020-06-25 14:12:20 -07:00
component_indexing_spec.ts build: update license headers to reference Google LLC (#37205) 2020-05-26 14:26:58 -04:00
env.ts fix(compiler-cli): ensure file_system handles mixed Windows drives (#37959) 2020-07-13 12:05:21 -07:00
incremental_error_spec.ts build: update license headers to reference Google LLC (#37205) 2020-05-26 14:26:58 -04:00
incremental_spec.ts build: update license headers to reference Google LLC (#37205) 2020-05-26 14:26:58 -04:00
modulewithproviders_spec.ts build: update license headers to reference Google LLC (#37205) 2020-05-26 14:26:58 -04:00
monorepo_spec.ts build: update license headers to reference Google LLC (#37205) 2020-05-26 14:26:58 -04:00
ngtsc_spec.ts fix(compiler-cli): mark eager NgModuleFactory construction as not side effectful (#38320) 2020-08-06 09:02:16 -07:00
scope_spec.ts feat(compiler-cli): explain why an expression cannot be used in AOT compilations (#37587) 2020-06-25 14:16:35 -07:00
sourcemap_utils.ts build: update license headers to reference Google LLC (#37205) 2020-05-26 14:26:58 -04:00
template_mapping_spec.ts build: update license headers to reference Google LLC (#37205) 2020-05-26 14:26:58 -04:00
template_typecheck_spec.ts fix(compiler-cli): type-check inputs that include undefined when there's coercion members (#38273) 2020-08-06 15:21:02 -07:00