diff --git a/underscore/underscore-tests.ts b/underscore/underscore-tests.ts
index 17398a3dd1..97aaf0cbf0 100644
--- a/underscore/underscore-tests.ts
+++ b/underscore/underscore-tests.ts
@@ -215,7 +215,6 @@ _.mixin({
return string.charAt(0).toUpperCase() + string.substring(1).toLowerCase();
}
});
-_("fabio").capitalize();
_.uniqueId('contact_');
diff --git a/underscore/underscore.d.ts b/underscore/underscore.d.ts
index 414c7653bd..d0ad26e1b1 100644
--- a/underscore/underscore.d.ts
+++ b/underscore/underscore.d.ts
@@ -3,15 +3,11 @@
// Definitions by: Boris Yankov
// Definitions: https://github.com/borisyankov/DefinitelyTyped
-declare function _(value): any;
+declare function _(value: Array): _;
+declare function _(value: T): _;
declare module _ {
- interface UnderscoreWrappedObject {
- value(): any;
- filter(arg?): any;
- }
-
interface TemplateSettings {
evaluate?: RegExp;
interpolate?: RegExp;
@@ -81,7 +77,6 @@ declare module _ {
export function pluck(list: Collection, propertyName: string): any[];
export function max(list: Collection, iterator?: (x: T) => any, context?: any): T;
-
export function min(list: Collection, iterator?: (x: T) => any, context?: any): T;
export function sortBy(list: List, iterator?: (x: T) => any, context?: any): T[];
@@ -116,18 +111,18 @@ declare module _ {
export function take(array: List, n: number): T[];
export function initial(array: List, n?: number): T[];
-
+
export function last(array: List): T;
export function last(array: List, n: number): T[];
-
+
export function rest(array: List, n?: number): T[];
export function tail(array: List, n?: number): T[];
export function drop(array: List, n?: number): T[];
-
+
export function compact(array: List): T[];
export function flatten(array: any[], shallow?: boolean): any[];
-
+
export function without(array: List, ...values: T[]): T[];
export function union(...arrays: List[]): T[];
@@ -138,18 +133,18 @@ declare module _ {
export function uniq(array: List, isSorted?: boolean, iterator?: (x: T) => any): T[];
export function unique(array: List, isSorted?: boolean, iterator?: (x: T) => any): T[];
-
+
export function zip(...arrays: any[]): any[];
export function object(list: any[], values?: any): any;
-
+
export function indexOf(array: List, value: T, isSorted?: boolean): number;
export function indexOf(array: List, value: T, startFrom: number): number;
export function lastIndexOf(array: List, value: T, fromIndex?: number): number;
-
+
export function sortedIndex(list: List, value: T, iterator?: (x: T) => any, context?: any): number;
-
+
export function range(stop: number): any[];
export function range(start: number, stop: number, step?: number): any[];
@@ -168,7 +163,7 @@ declare module _ {
export function after(count: number, func: any): any;
export function wrap(func: (...as: any[]) => any, wrapper: any): () => any;
export function compose(...functions: any[]): any;
-
+
/****
Objects
*****/
@@ -179,10 +174,12 @@ declare module _ {
export function functions(object: any): string[];
export function methods(object: any): string[];
export function extend(destination: any, ...sources: any[]): any;
+ export function pick(object: any, keys: string[]): any;
export function pick(object: any, ...keys: string[]): any;
+ export function omit(object: any, keys: string[]): any;
export function omit(object: any, ...keys: string[]): any;
export function defaults(object: any, ...defaults: any[]): any;
- export function clone(object: any): any;
+ export function clone(object: T): T;
export function tap(object: any, interceptor: (...as: any[]) => any): any;
export function has(object: any, key: string): boolean;
export function isEqual(object: any, other: any): boolean;
@@ -220,7 +217,169 @@ declare module _ {
/****
Chaining
*****/
- export function chain(object: any): UnderscoreWrappedObject;
+ export function chain(object): any;
+}
+
+declare class _ {
+
+ each(iterator: _.ListIterator, context?: any): void;
+ forEach(iterator: _.ListIterator, context?: any): void;
+
+ map(iterator: _.ListIterator, context?: any): TResult[];
+ collect(iterator: _.ListIterator, context?: any): TResult[];
+
+ reduce(iterator: (prev: TResult, curr: T) => TResult, memo: TResult, context?: any): TResult;
+ inject(iterator: (prev: TResult, curr: T) => TResult, memo: TResult, context?: any): TResult;
+
+ reduceRight(iterator: (prev: TResult, curr: T) => TResult, memo: TResult, context?: any): TResult;
+ foldr(iterator: (prev: TResult, curr: T) => TResult, memo: TResult, context?: any): TResult;
+
+ find(iterator: (x: T) => boolean, context?: any): T;
+ detect(iterator: (x: T) => boolean, context?: any): T;
+
+ filter(iterator: (x: T) => boolean, context?: any): T[];
+ select(iterator: (x: T) => boolean, context?: any): T[];
+
+ where(properties: any): T[];
+
+ reject(iterator: (x: T) => boolean, context?: any): T[];
+
+ all(iterator: (x: T) => boolean, context?: any): boolean;
+ every(iterator: (x: T) => boolean, context?: any): boolean;
+
+ any(iterator?: (x: T) => boolean, context?: any): boolean;
+ some(iterator?: (x: T) => boolean, context?: any): boolean;
+
+ contains(value: T): boolean;
+ include(value: T): boolean;
+
+ invoke(methodName: string, ...arguments: any[]): any;
+
+ pluck(propertyName: string): any[];
+
+ max(iterator?: (x: T) => any, context?: any): T;
+ min(iterator?: (x: T) => any, context?: any): T;
+
+ sortBy(iterator?: (x: T) => any, context?: any): T[];
+ sortBy(iterator: string, context?: any): T[];
+
+ groupBy(iterator?: (x: T) => any, context?: any): _.Dictionary<_.List>;
+ groupBy(iterator: string, context?: any): _.Dictionary<_.List>;
+
+ countBy(iterator?: (x: T) => any, context?: any): _.Dictionary<_.List>;
+ countBy(iterator: string, context?: any): _.Dictionary<_.List>;
+
+ shuffle(): T[];
+
+ toArray(): T[];
+
+ size(): number;
+
+ /****
+ Arrays
+ *****/
+ first(n?: number): T[];
+ head(n?: number): T[];
+ take(n?: number): T[];
+ initial(n?: number): T[];
+ last(n?: number): T[];
+ rest(n?: number): T[];
+ tail(n?: number): T[];
+ drop(n?: number): T[];
+
+ compact(): T[];
+
+ flatten(shallow?: boolean): any[];
+
+ without(...values: T[]): T[];
+
+ union(...arrays: _.List[]): T[];
+
+ intersection(...arrays: _.List[]): T[];
+
+ difference(...others: _.List[]): T[];
+
+ uniq(isSorted?: boolean, iterator?: (x: T) => any): T[];
+ unique(isSorted?: boolean, iterator?: (x: T) => any): T[];
+
+ zip(...arrays: any[]): any[];
+
+ object(values?: any): any;
+
+ indexOf(value: T, isSorted?: boolean): number;
+ indexOf(value: T, startFrom: number): number;
+
+ lastIndexOf(value: T, fromIndex?: number): number;
+
+ sortedIndex(value: T, iterator?: (x: T) => any, context?: any): number;
+
+ /****
+ Functions
+ *****/
+ bind(func: (...as: any[]) => any, context: any, ...arguments: any[]): () => any;
+ bindAll(...methodNames: string[]): any;
+ memoize(hashFunction?: any): any;
+ defer();
+ delay(wait: number, ...arguments: any[]): any;
+ delay(...arguments: any[]): any;
+ throttle(wait: number): any;
+ debounce(wait: number, immediate?: boolean): any;
+ once(): any;
+ after(func: any): any;
+ wrap(wrapper: any): () => any;
+ compose(...functions: any[]): any;
+
+ /****
+ Objects
+ *****/
+ keys(): string[];
+ values(): T[];
+ pairs(): any[];
+ invert(): any;
+ functions(): string[];
+ methods(): string[];
+ extend(...sources: any[]): any;
+ pick(keys: string[]): any;
+ pick(...keys: string[]): any;
+ omit(keys: string[]): any;
+ omit(...keys: string[]): any;
+ defaults(...defaults: any[]): any;
+ clone(): T;
+ tap(interceptor: (...as: any[]) => any): any;
+ has(key: string): boolean;
+ isEqual(other: any): boolean;
+ isEmpty(): boolean;
+ isElement(): boolean;
+ isArray(): boolean;
+ isObject(): boolean;
+ isArguments(): boolean;
+ isFunction(): boolean;
+ isString(): boolean;
+ isNumber(): boolean;
+ isFinite(): boolean;
+ isBoolean(): boolean;
+ isDate(): boolean;
+ isRegExp(): boolean;
+ isNaN(): boolean;
+ isNull(): boolean;
+ isUndefined(): boolean;
+
+ /****
+ Utility
+ *****/
+ identity(): any;
+ times(iterator: (index: number) => void , context?: any): void;
+ random(max: number): number;
+ mixin(): void;
+ uniqueId(): string;
+ escape(): string;
+ result(property: string): any;
+ template(data?: any, settings?: any): (...data: any[]) => string;
+
+ /****
+ Chaining
+ *****/
+ chain(): any;
}
declare module "underscore" {