From 22894235a23f59f738278398144d9fc57c002cd9 Mon Sep 17 00:00:00 2001 From: John Reilly Date: Tue, 29 Jul 2014 11:08:28 +0100 Subject: [PATCH 1/3] Add genericised forEach and indexer for FormController --- angularjs/angular-tests.ts | 9 ++++++++ angularjs/angular.d.ts | 45 ++++++++++++++++++++++++++++++++++---- 2 files changed, 50 insertions(+), 4 deletions(-) diff --git a/angularjs/angular-tests.ts b/angularjs/angular-tests.ts index 7f1e6edf9..1502ac963 100644 --- a/angularjs/angular-tests.ts +++ b/angularjs/angular-tests.ts @@ -251,6 +251,15 @@ httpFoo.then((x) => { }); +function test_angular_forEach() { + var values: { [key: string]: string } = { name: 'misko', gender: 'male' }; + var log = []; + angular.forEach(values, function (value, key) { + this.push(key + ': ' + value); + }, log); + //expect(log).toEqual(['name: misko', 'gender: male']); +} + // angular.element() tests var element = angular.element("div.myApp"); var scope: ng.IScope = element.scope(); diff --git a/angularjs/angular.d.ts b/angularjs/angular.d.ts index ca8751b8e..c515b096f 100755 --- a/angularjs/angular.d.ts +++ b/angularjs/angular.d.ts @@ -46,7 +46,38 @@ declare module ng { element: IAugmentedJQueryStatic; equals(value1: any, value2: any): boolean; extend(destination: any, ...sources: any[]): any; + + /** + * Invokes the iterator function once for each item in obj collection, which can be either an object or an array. The iterator function is invoked with iterator(value, key), where value is the value of an object property or an array element and key is the object property key or array element index. Specifying a context for the function is optional. + * + * It is worth noting that .forEach does not iterate over inherited properties because it filters using the hasOwnProperty method. + * + * @param obj Object to iterate over. + * @param iterator Iterator function. + * @param context Object to become context (this) for the iterator function. + */ + forEach(obj: T[], iterator: (value: T, key: number) => any, context?: any): any; + /** + * Invokes the iterator function once for each item in obj collection, which can be either an object or an array. The iterator function is invoked with iterator(value, key), where value is the value of an object property or an array element and key is the object property key or array element index. Specifying a context for the function is optional. + * + * It is worth noting that .forEach does not iterate over inherited properties because it filters using the hasOwnProperty method. + * + * @param obj Object to iterate over. + * @param iterator Iterator function. + * @param context Object to become context (this) for the iterator function. + */ + forEach(obj: { [index: string]: T; }, iterator: (value: T, key: string) => any, context?: any): any; + /** + * Invokes the iterator function once for each item in obj collection, which can be either an object or an array. The iterator function is invoked with iterator(value, key), where value is the value of an object property or an array element and key is the object property key or array element index. Specifying a context for the function is optional. + * + * It is worth noting that .forEach does not iterate over inherited properties because it filters using the hasOwnProperty method. + * + * @param obj Object to iterate over. + * @param iterator Iterator function. + * @param context Object to become context (this) for the iterator function. + */ forEach(obj: any, iterator: (value: any, key: any) => any, context?: any): any; + fromJson(json: string): any; identity(arg?: any): any; injector(modules?: any[]): auto.IInjectorService; @@ -221,11 +252,17 @@ declare module ng { $attr: Object; } - /////////////////////////////////////////////////////////////////////////// - // FormController - // see http://docs.angularjs.org/api/ng.directive:form.FormController - /////////////////////////////////////////////////////////////////////////// + /** + * form.FormController - type in module ng + * see https://docs.angularjs.org/api/ng/type/form.FormController + */ interface IFormController { + + /** + * Indexer which should return ng.INgModelController for most properties but cannot because of "All named properties must be assignable to string indexer type" constraint - see https://github.com/Microsoft/TypeScript/issues/272 + */ + [name: string]: any; + $pristine: boolean; $dirty: boolean; $valid: boolean; From 68a3cb28753ddce6c9d9b1ea0f3dc5c5a9d3e42f Mon Sep 17 00:00:00 2001 From: John Reilly Date: Tue, 29 Jul 2014 11:21:28 +0100 Subject: [PATCH 2/3] Fix test --- angularjs/angular-tests.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/angularjs/angular-tests.ts b/angularjs/angular-tests.ts index 1502ac963..d7f2a5bd5 100644 --- a/angularjs/angular-tests.ts +++ b/angularjs/angular-tests.ts @@ -254,7 +254,7 @@ httpFoo.then((x) => { function test_angular_forEach() { var values: { [key: string]: string } = { name: 'misko', gender: 'male' }; var log = []; - angular.forEach(values, function (value, key) { + angular.forEach(values, function (value: string, key: string) { this.push(key + ': ' + value); }, log); //expect(log).toEqual(['name: misko', 'gender: male']); From 86d681f2890170baae4a47016fb3bf01dcdc41d0 Mon Sep 17 00:00:00 2001 From: John Reilly Date: Tue, 29 Jul 2014 11:26:06 +0100 Subject: [PATCH 3/3] Fix test --- angularjs/angular-tests.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/angularjs/angular-tests.ts b/angularjs/angular-tests.ts index d7f2a5bd5..a1577856e 100644 --- a/angularjs/angular-tests.ts +++ b/angularjs/angular-tests.ts @@ -253,8 +253,8 @@ httpFoo.then((x) => { function test_angular_forEach() { var values: { [key: string]: string } = { name: 'misko', gender: 'male' }; - var log = []; - angular.forEach(values, function (value: string, key: string) { + var log: string[] = []; + angular.forEach(values, function (value, key) { this.push(key + ': ' + value); }, log); //expect(log).toEqual(['name: misko', 'gender: male']);