From 0b14caaae2b1d1809a5b2b5f6017a1d449acb4a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mis=CC=8Cko=20Hevery?= Date: Thu, 27 Apr 2017 13:39:21 -0700 Subject: [PATCH] fix: strictNullCheck support. (#16389) Fix #16357 Workaround for https://github.com/Microsoft/TypeScript/issues/10078 Closes #16389 --- integration/typings_test_ts21/include-all.ts | 2 + integration/typings_test_ts21/package.json | 1 + integration/typings_test_ts21/tsconfig.json | 3 +- integration/typings_test_ts22/include-all.ts | 2 + integration/typings_test_ts22/package.json | 1 + integration/typings_test_ts22/tsconfig.json | 5 +- packages/forms/src/model.ts | 72 +++++++++----------- tools/public_api_guard/forms/forms.d.ts | 16 ++--- 8 files changed, 50 insertions(+), 52 deletions(-) diff --git a/integration/typings_test_ts21/include-all.ts b/integration/typings_test_ts21/include-all.ts index 499b6e6024037..916cf719e4ec2 100644 --- a/integration/typings_test_ts21/include-all.ts +++ b/integration/typings_test_ts21/include-all.ts @@ -9,6 +9,7 @@ import * as compiler from '@angular/compiler'; import * as compilerTesting from '@angular/compiler/testing'; import * as coreTesting from '@angular/core'; +import * as forms from '@angular/forms'; import * as core from '@angular/core/testing'; import * as httpTesting from '@angular/http'; import * as http from '@angular/http/testing'; @@ -26,6 +27,7 @@ export default { compilerTesting, core, coreTesting, + forms, http, httpTesting, platformBrowser, diff --git a/integration/typings_test_ts21/package.json b/integration/typings_test_ts21/package.json index c051e33df60e9..98fabcb911942 100644 --- a/integration/typings_test_ts21/package.json +++ b/integration/typings_test_ts21/package.json @@ -9,6 +9,7 @@ "@angular/compiler": "file:../../dist/packages-dist/compiler", "@angular/compiler-cli": "file:../../dist/packages-dist/compiler-cli", "@angular/core": "file:../../dist/packages-dist/core", + "@angular/forms": "file:../../dist/packages-dist/forms", "@angular/http": "file:../../dist/packages-dist/http", "@angular/platform-browser": "file:../../dist/packages-dist/platform-browser", "@angular/platform-browser-dynamic": "file:../../dist/packages-dist/platform-browser-dynamic", diff --git a/integration/typings_test_ts21/tsconfig.json b/integration/typings_test_ts21/tsconfig.json index 7c9539fff666a..468b20cdace3f 100644 --- a/integration/typings_test_ts21/tsconfig.json +++ b/integration/typings_test_ts21/tsconfig.json @@ -9,8 +9,7 @@ "target": "es5", "lib": ["es5", "dom", "es2015.collection", "es2015.iterable", "es2015.promise"], "types": [], - // TODO(i): strictNullChecks should turned on but are temporarily disabled due to #15432 - "strictNullChecks": false + "strictNullChecks": true }, "files": [ "include-all.ts", diff --git a/integration/typings_test_ts22/include-all.ts b/integration/typings_test_ts22/include-all.ts index 499b6e6024037..9a869b7ce2e32 100644 --- a/integration/typings_test_ts22/include-all.ts +++ b/integration/typings_test_ts22/include-all.ts @@ -10,6 +10,7 @@ import * as compiler from '@angular/compiler'; import * as compilerTesting from '@angular/compiler/testing'; import * as coreTesting from '@angular/core'; import * as core from '@angular/core/testing'; +import * as forms from '@angular/forms'; import * as httpTesting from '@angular/http'; import * as http from '@angular/http/testing'; import * as platformBrowserTesting from '@angular/platform-browser'; @@ -26,6 +27,7 @@ export default { compilerTesting, core, coreTesting, + forms, http, httpTesting, platformBrowser, diff --git a/integration/typings_test_ts22/package.json b/integration/typings_test_ts22/package.json index 2152eb41e9665..45092aa006e0e 100644 --- a/integration/typings_test_ts22/package.json +++ b/integration/typings_test_ts22/package.json @@ -9,6 +9,7 @@ "@angular/compiler": "file:../../dist/packages-dist/compiler", "@angular/compiler-cli": "file:../../dist/packages-dist/compiler-cli", "@angular/core": "file:../../dist/packages-dist/core", + "@angular/forms": "file:../../dist/packages-dist/forms", "@angular/http": "file:../../dist/packages-dist/http", "@angular/platform-browser": "file:../../dist/packages-dist/platform-browser", "@angular/platform-browser-dynamic": "file:../../dist/packages-dist/platform-browser-dynamic", diff --git a/integration/typings_test_ts22/tsconfig.json b/integration/typings_test_ts22/tsconfig.json index 02f12fe4b7439..d9603e8dce799 100644 --- a/integration/typings_test_ts22/tsconfig.json +++ b/integration/typings_test_ts22/tsconfig.json @@ -15,11 +15,10 @@ "es2015.promise" ], "types": [], - // TODO(i): strictNullChecks should turned on but are temporarily disabled due to #15432 - "strictNullChecks": false + "strictNullChecks": true }, "files": [ "include-all.ts", "node_modules/@types/jasmine/index.d.ts" ] -} \ No newline at end of file +} diff --git a/packages/forms/src/model.ts b/packages/forms/src/model.ts index d072b7ed056a8..7da7e6621f502 100644 --- a/packages/forms/src/model.ts +++ b/packages/forms/src/model.ts @@ -659,17 +659,18 @@ export class FormControl extends AbstractControl { * If `emitViewToModelChange` is `true`, an ngModelChange event will be fired to update the * model. This is the default behavior if `emitViewToModelChange` is not specified. */ - setValue(value: any, {onlySelf, emitEvent, emitModelToViewChange, emitViewToModelChange}: { + setValue(value: any, options: { onlySelf?: boolean, emitEvent?: boolean, emitModelToViewChange?: boolean, emitViewToModelChange?: boolean } = {}): void { this._value = value; - if (this._onChange.length && emitModelToViewChange !== false) { - this._onChange.forEach((changeFn) => changeFn(this._value, emitViewToModelChange !== false)); + if (this._onChange.length && options.emitModelToViewChange !== false) { + this._onChange.forEach( + (changeFn) => changeFn(this._value, options.emitViewToModelChange !== false)); } - this.updateValueAndValidity({onlySelf, emitEvent}); + this.updateValueAndValidity(options); } /** @@ -716,12 +717,11 @@ export class FormControl extends AbstractControl { * console.log(this.control.status); // 'DISABLED' * ``` */ - reset(formState: any = null, {onlySelf, emitEvent}: {onlySelf?: boolean, - emitEvent?: boolean} = {}): void { + reset(formState: any = null, options: {onlySelf?: boolean, emitEvent?: boolean} = {}): void { this._applyFormState(formState); - this.markAsPristine({onlySelf}); - this.markAsUntouched({onlySelf}); - this.setValue(this._value, {onlySelf, emitEvent}); + this.markAsPristine(options); + this.markAsUntouched(options); + this.setValue(this._value, options); } /** @@ -914,15 +914,14 @@ export class FormGroup extends AbstractControl { * * ``` */ - setValue( - value: {[key: string]: any}, - {onlySelf, emitEvent}: {onlySelf?: boolean, emitEvent?: boolean} = {}): void { + setValue(value: {[key: string]: any}, options: {onlySelf?: boolean, emitEvent?: boolean} = {}): + void { this._checkAllValuesPresent(value); Object.keys(value).forEach(name => { this._throwIfControlMissing(name); - this.controls[name].setValue(value[name], {onlySelf: true, emitEvent}); + this.controls[name].setValue(value[name], {onlySelf: true, emitEvent: options.emitEvent}); }); - this.updateValueAndValidity({onlySelf, emitEvent}); + this.updateValueAndValidity(options); } /** @@ -946,15 +945,14 @@ export class FormGroup extends AbstractControl { * * ``` */ - patchValue( - value: {[key: string]: any}, - {onlySelf, emitEvent}: {onlySelf?: boolean, emitEvent?: boolean} = {}): void { + patchValue(value: {[key: string]: any}, options: {onlySelf?: boolean, emitEvent?: boolean} = {}): + void { Object.keys(value).forEach(name => { if (this.controls[name]) { - this.controls[name].patchValue(value[name], {onlySelf: true, emitEvent}); + this.controls[name].patchValue(value[name], {onlySelf: true, emitEvent: options.emitEvent}); } }); - this.updateValueAndValidity({onlySelf, emitEvent}); + this.updateValueAndValidity(options); } /** @@ -989,14 +987,13 @@ export class FormGroup extends AbstractControl { * console.log(this.form.get('first').status); // 'DISABLED' * ``` */ - reset(value: any = {}, {onlySelf, emitEvent}: {onlySelf?: boolean, emitEvent?: boolean} = {}): - void { + reset(value: any = {}, options: {onlySelf?: boolean, emitEvent?: boolean} = {}): void { this._forEachChild((control: AbstractControl, name: string) => { - control.reset(value[name], {onlySelf: true, emitEvent}); + control.reset(value[name], {onlySelf: true, emitEvent: options.emitEvent}); }); - this.updateValueAndValidity({onlySelf, emitEvent}); - this._updatePristine({onlySelf}); - this._updateTouched({onlySelf}); + this.updateValueAndValidity(options); + this._updatePristine(options); + this._updateTouched(options); } /** @@ -1222,14 +1219,13 @@ export class FormArray extends AbstractControl { * console.log(arr.value); // ['Nancy', 'Drew'] * ``` */ - setValue(value: any[], {onlySelf, emitEvent}: {onlySelf?: boolean, emitEvent?: boolean} = {}): - void { + setValue(value: any[], options: {onlySelf?: boolean, emitEvent?: boolean} = {}): void { this._checkAllValuesPresent(value); value.forEach((newValue: any, index: number) => { this._throwIfControlMissing(index); - this.at(index).setValue(newValue, {onlySelf: true, emitEvent}); + this.at(index).setValue(newValue, {onlySelf: true, emitEvent: options.emitEvent}); }); - this.updateValueAndValidity({onlySelf, emitEvent}); + this.updateValueAndValidity(options); } /** @@ -1252,14 +1248,13 @@ export class FormArray extends AbstractControl { * console.log(arr.value); // ['Nancy', null] * ``` */ - patchValue(value: any[], {onlySelf, emitEvent}: {onlySelf?: boolean, emitEvent?: boolean} = {}): - void { + patchValue(value: any[], options: {onlySelf?: boolean, emitEvent?: boolean} = {}): void { value.forEach((newValue: any, index: number) => { if (this.at(index)) { - this.at(index).patchValue(newValue, {onlySelf: true, emitEvent}); + this.at(index).patchValue(newValue, {onlySelf: true, emitEvent: options.emitEvent}); } }); - this.updateValueAndValidity({onlySelf, emitEvent}); + this.updateValueAndValidity(options); } /** @@ -1293,14 +1288,13 @@ export class FormArray extends AbstractControl { * console.log(this.arr.get(0).status); // 'DISABLED' * ``` */ - reset(value: any = [], {onlySelf, emitEvent}: {onlySelf?: boolean, emitEvent?: boolean} = {}): - void { + reset(value: any = [], options: {onlySelf?: boolean, emitEvent?: boolean} = {}): void { this._forEachChild((control: AbstractControl, index: number) => { - control.reset(value[index], {onlySelf: true, emitEvent}); + control.reset(value[index], {onlySelf: true, emitEvent: options.emitEvent}); }); - this.updateValueAndValidity({onlySelf, emitEvent}); - this._updatePristine({onlySelf}); - this._updateTouched({onlySelf}); + this.updateValueAndValidity(options); + this._updatePristine(options); + this._updateTouched(options); } /** diff --git a/tools/public_api_guard/forms/forms.d.ts b/tools/public_api_guard/forms/forms.d.ts index fdfc00298b09c..f65e5df899b02 100644 --- a/tools/public_api_guard/forms/forms.d.ts +++ b/tools/public_api_guard/forms/forms.d.ts @@ -179,18 +179,18 @@ export declare class FormArray extends AbstractControl { at(index: number): AbstractControl; getRawValue(): any[]; insert(index: number, control: AbstractControl): void; - patchValue(value: any[], {onlySelf, emitEvent}?: { + patchValue(value: any[], options?: { onlySelf?: boolean; emitEvent?: boolean; }): void; push(control: AbstractControl): void; removeAt(index: number): void; - reset(value?: any, {onlySelf, emitEvent}?: { + reset(value?: any, options?: { onlySelf?: boolean; emitEvent?: boolean; }): void; setControl(index: number, control: AbstractControl): void; - setValue(value: any[], {onlySelf, emitEvent}?: { + setValue(value: any[], options?: { onlySelf?: boolean; emitEvent?: boolean; }): void; @@ -231,11 +231,11 @@ export declare class FormControl extends AbstractControl { }): void; registerOnChange(fn: Function): void; registerOnDisabledChange(fn: (isDisabled: boolean) => void): void; - reset(formState?: any, {onlySelf, emitEvent}?: { + reset(formState?: any, options?: { onlySelf?: boolean; emitEvent?: boolean; }): void; - setValue(value: any, {onlySelf, emitEvent, emitModelToViewChange, emitViewToModelChange}?: { + setValue(value: any, options?: { onlySelf?: boolean; emitEvent?: boolean; emitModelToViewChange?: boolean; @@ -289,20 +289,20 @@ export declare class FormGroup extends AbstractControl { getRawValue(): any; patchValue(value: { [key: string]: any; - }, {onlySelf, emitEvent}?: { + }, options?: { onlySelf?: boolean; emitEvent?: boolean; }): void; registerControl(name: string, control: AbstractControl): AbstractControl; removeControl(name: string): void; - reset(value?: any, {onlySelf, emitEvent}?: { + reset(value?: any, options?: { onlySelf?: boolean; emitEvent?: boolean; }): void; setControl(name: string, control: AbstractControl): void; setValue(value: { [key: string]: any; - }, {onlySelf, emitEvent}?: { + }, options?: { onlySelf?: boolean; emitEvent?: boolean; }): void;