// Type definitions for Underscore 1.6.0 // Project: http://underscorejs.org/ // Definitions by: Boris Yankov , Josh Baldwin // Definitions: https://github.com/borisyankov/DefinitelyTyped declare module _ { /** * underscore.js _.throttle options. **/ interface ThrottleSettings { /** * If you'd like to disable the leading-edge call, pass this as false. **/ leading?: boolean; /** * If you'd like to disable the execution on the trailing-edge, pass false. **/ trailing?: boolean; } /** * underscore.js template settings, set templateSettings or pass as an argument * to 'template()' to override defaults. **/ interface TemplateSettings { /** * Default value is '/<%([\s\S]+?)%>/g'. **/ evaluate?: RegExp; /** * Default value is '/<%=([\s\S]+?)%>/g'. **/ interpolate?: RegExp; /** * Default value is '/<%-([\s\S]+?)%>/g'. **/ escape?: RegExp; } interface ListIterator { (value: T, index: number, list: T[]): TResult; } interface ObjectIterator { (element: T, key: string, list: any): TResult; } interface MemoIterator { (prev: TResult, curr: T, index: number, list: T[]): TResult; } interface Collection { } // Common interface between Arrays and jQuery objects interface List extends Collection { [index: number]: T; length: number; } interface Dictionary extends Collection { [index: string]: T; } } interface UnderscoreStatic { /** * Underscore OOP Wrapper, all Underscore functions that take an object * as the first parameter can be invoked through this function. * @param key First argument to Underscore object functions. **/ (value: Array): Underscore; (value: T): Underscore; /* ************* * Collections * ************* */ /** * Iterates over a list of elements, yielding each in turn to an iterator function. The iterator is * bound to the context object, if one is passed. Each invocation of iterator is called with three * arguments: (element, index, list). If list is a JavaScript object, iterator's arguments will be * (value, key, object). Delegates to the native forEach function if it exists. * @param list Iterates over this list of elements. * @param iterator Iterator function for each element `list`. * @param context 'this' object in `iterator`, optional. **/ each( list: _.List, iterator: _.ListIterator, context?: any): _.List; /** * @see _.each * @param object Iterates over properties of this object. * @param iterator Iterator function for each property on `object`. * @param context 'this' object in `iterator`, optional. **/ each( object: _.Dictionary, iterator: _.ObjectIterator, context?: any): _.Dictionary; /** * @see _.each **/ forEach( list: _.List, iterator: _.ListIterator, context?: any): _.List; /** * @see _.each **/ forEach( object: _.Dictionary, iterator: _.ObjectIterator, context?: any): _.Dictionary; /** * Produces a new array of values by mapping each value in list through a transformation function * (iterator). If the native map method exists, it will be used instead. If list is a JavaScript * object, iterator's arguments will be (value, key, object). * @param list Maps the elements of this array. * @param iterator Map iterator function for each element in `list`. * @param context `this` object in `iterator`, optional. * @return The mapped array result. **/ map( list: _.List, iterator: _.ListIterator, context?: any): TResult[]; /** * @see _.map * @param object Maps the properties of this object. * @param iterator Map iterator function for each property on `object`. * @param context `this` object in `iterator`, optional. * @return The mapped object result. **/ map( object: _.Dictionary, iterator: _.ObjectIterator, context?: any): TResult[]; /** * @see _.map **/ collect( list: _.List, iterator: _.ListIterator, context?: any): TResult[]; /** * @see _.map **/ collect( object: _.Dictionary, iterator: _.ObjectIterator, context?: any): TResult[]; /** * Also known as inject and foldl, reduce boils down a list of values into a single value. * Memo is the initial state of the reduction, and each successive step of it should be * returned by iterator. The iterator is passed four arguments: the memo, then the value * and index (or key) of the iteration, and finally a reference to the entire list. * @param list Reduces the elements of this array. * @param iterator Reduce iterator function for each element in `list`. * @param memo Initial reduce state. * @param context `this` object in `iterator`, optional. * @return Reduced object result. **/ reduce( list: _.Collection, iterator: _.MemoIterator, memo?: TResult, context?: any): TResult; /** * @see _.reduce **/ inject( list: _.Collection, iterator: _.MemoIterator, memo?: TResult, context?: any): TResult; /** * @see _.reduce **/ foldl( list: _.Collection, iterator: _.MemoIterator, memo?: TResult, context?: any): TResult; /** * The right-associative version of reduce. Delegates to the JavaScript 1.8 version of * reduceRight, if it exists. `foldr` is not as useful in JavaScript as it would be in a * language with lazy evaluation. * @param list Reduces the elements of this array. * @param iterator Reduce iterator function for each element in `list`. * @param memo Initial reduce state. * @param context `this` object in `iterator`, optional. * @return Reduced object result. **/ reduceRight( list: _.Collection, iterator: _.MemoIterator, memo?: TResult, context?: any): TResult; /** * @see _.reduceRight **/ foldr( list: _.Collection, iterator: _.MemoIterator, memo?: TResult, context?: any): TResult; /** * Looks through each value in the list, returning the first one that passes a truth * test (iterator). The function returns as soon as it finds an acceptable element, * and doesn't traverse the entire list. * @param list Searches for a value in this list. * @param iterator Search iterator function for each element in `list`. * @param context `this` object in `iterator`, optional. * @return The first acceptable found element in `list`, if nothing is found undefined/null is returned. **/ find( list: _.List, iterator: _.ListIterator, context?: any): T; /** * @see _.find **/ find( object: _.Dictionary, iterator: _.ObjectIterator, context?: any): T; /** * @see _.find **/ detect( list: _.List, iterator: _.ListIterator, context?: any): T; /** * @see _.find **/ detect( object: _.Dictionary, iterator: _.ObjectIterator, context?: any): T; /** * Looks through each value in the list, returning an array of all the values that pass a truth * test (iterator). Delegates to the native filter method, if it exists. * @param list Filter elements out of this list. * @param iterator Filter iterator function for each element in `list`. * @param context `this` object in `iterator`, optional. * @return The filtered list of elements. **/ filter( list: _.List, iterator: _.ListIterator, context?: any): T[]; /** * @see _.filter **/ filter( object: _.Dictionary, iterator: _.ObjectIterator, context?: any): T[]; /** * @see _.filter **/ select( list: _.List, iterator: _.ListIterator, context?: any): T[]; /** * @see _.filter **/ select( object: _.Dictionary, iterator: _.ObjectIterator, context?: any): T[]; /** * Looks through each value in the list, returning an array of all the values that contain all * of the key-value pairs listed in properties. * @param list List to match elements again `properties`. * @param properties The properties to check for on each element within `list`. * @return The elements within `list` that contain the required `properties`. **/ where( list: _.List, properties: U): T[]; /** * Looks through the list and returns the first value that matches all of the key-value pairs listed in properties. * @param list Search through this list's elements for the first object with all `properties`. * @param properties Properties to look for on the elements within `list`. * @return The first element in `list` that has all `properties`. **/ findWhere( list: _.List, properties: U): T; /** * Returns the values in list without the elements that the truth test (iterator) passes. * The opposite of filter. * Return all the elements for which a truth test fails. * @param list Reject elements within this list. * @param iterator Reject iterator function for each element in `list`. * @param context `this` object in `iterator`, optional. * @return The rejected list of elements. **/ reject( list: _.List, iterator: _.ListIterator, context?: any): T[]; /** * @see _.reject **/ reject( object: _.Dictionary, iterator: _.ObjectIterator, context?: any): T[]; /** * Returns true if all of the values in the list pass the iterator truth test. Delegates to the * native method every, if present. * @param list Truth test against all elements within this list. * @param iterator Trust test iterator function for each element in `list`. * @param context `this` object in `iterator`, optional. * @return True if all elements passed the truth test, otherwise false. **/ every( list: _.List, iterator?: _.ListIterator, context?: any): boolean; /** * @see _.every **/ every( list: _.Dictionary, iterator?: _.ObjectIterator, context?: any): boolean; /** * @see _.every **/ all( list: _.List, iterator?: _.ListIterator, context?: any): boolean; /** * @see _.every **/ all( list: _.Dictionary, iterator?: _.ObjectIterator, context?: any): boolean; /** * Returns true if any of the values in the list pass the iterator truth test. Short-circuits and * stops traversing the list if a true element is found. Delegates to the native method some, if present. * @param list Truth test against all elements within this list. * @param iterator Trust test iterator function for each element in `list`. * @param context `this` object in `iterator`, optional. * @return True if any elements passed the truth test, otherwise false. **/ some( list: _.List, iterator?: _.ListIterator, context?: any): boolean; /** * @see _.some **/ some( object: _.Dictionary, iterator?: _.ObjectIterator, context?: any): boolean; /** * @see _.some **/ any( list: _.List, iterator?: _.ListIterator, context?: any): boolean; /** * @see _.some **/ any( object: _.Dictionary, iterator?: _.ObjectIterator, context?: any): boolean; /** * Returns true if the value is present in the list. Uses indexOf internally, * if list is an Array. * @param list Checks each element to see if `value` is present. * @param value The value to check for within `list`. * @return True if `value` is present in `list`, otherwise false. **/ contains( list: _.List, value: T): boolean; /** * @see _.contains **/ contains( object: _.Dictionary, value: T): boolean; /** * @see _.contains **/ include( list: _.Collection, value: T): boolean; /** * @see _.contains **/ include( object: _.Dictionary, value: T): boolean; /** * Calls the method named by methodName on each value in the list. Any extra arguments passed to * invoke will be forwarded on to the method invocation. * @param list The element's in this list will each have the method `methodName` invoked. * @param methodName The method's name to call on each element within `list`. * @param arguments Additional arguments to pass to the method `methodName`. **/ invoke( list: _.List, methodName: string, ...arguments: any[]): any; /** * A convenient version of what is perhaps the most common use-case for map: extracting a list of * property values. * @param list The list to pluck elements out of that have the property `propertyName`. * @param propertyName The property to look for on each element within `list`. * @return The list of elements within `list` that have the property `propertyName`. **/ pluck( list: _.List, propertyName: string): any[]; /** * Returns the maximum value in list. * @param list Finds the maximum value in this list. * @return Maximum value in `list`. **/ max(list: _.List): number; /** * Returns the maximum value in list. If iterator is passed, it will be used on each value to generate * the criterion by which the value is ranked. * @param list Finds the maximum value in this list. * @param iterator Compares each element in `list` to find the maximum value. * @param context `this` object in `iterator`, optional. * @return The maximum element within `list`. **/ max( list: _.List, iterator?: _.ListIterator, context?: any): T; /** * Returns the minimum value in list. * @param list Finds the minimum value in this list. * @return Minimum value in `list`. **/ min(list: _.List): number; /** * Returns the minimum value in list. If iterator is passed, it will be used on each value to generate * the criterion by which the value is ranked. * @param list Finds the minimum value in this list. * @param iterator Compares each element in `list` to find the minimum value. * @param context `this` object in `iterator`, optional. * @return The minimum element within `list`. **/ min( list: _.List, iterator?: _.ListIterator, context?: any): T; /** * Returns a sorted copy of list, ranked in ascending order by the results of running each value * through iterator. Iterator may also be the string name of the property to sort by (eg. length). * @param list Sorts this list. * @param iterator Sort iterator for each element within `list`. * @param context `this` object in `iterator`, optional. * @return A sorted copy of `list`. **/ sortBy( list: _.List, iterator?: _.ListIterator, context?: any): T[]; /** * @see _.sortBy * @param iterator Sort iterator for each element within `list`. **/ sortBy( list: _.List, iterator: string, context?: any): T[]; /** * Splits a collection into sets, grouped by the result of running each value through iterator. * If iterator is a string instead of a function, groups by the property named by iterator on * each of the values. * @param list Groups this list. * @param iterator Group iterator for each element within `list`, return the key to group the element by. * @param context `this` object in `iterator`, optional. * @return An object with the group names as properties where each property contains the grouped elements from `list`. **/ groupBy( list: _.List, iterator?: _.ListIterator, context?: any): _.Dictionary; /** * @see _.groupBy * @param iterator Property on each object to group them by. **/ groupBy( list: _.List, iterator: string, context?: any): _.Dictionary; /** * Given a `list`, and an `iterator` function that returns a key for each element in the list (or a property name), * returns an object with an index of each item. Just like _.groupBy, but for when you know your keys are unique. **/ indexBy( list: _.List, iterator: _.ListIterator, context?: any): _.Dictionary; /** * @see _.indexBy * @param iterator Property on each object to index them by. **/ indexBy( list: _.List, iterator: string, context?: any): _.Dictionary; /** * Sorts a list into groups and returns a count for the number of objects in each group. Similar * to groupBy, but instead of returning a list of values, returns a count for the number of values * in that group. * @param list Group elements in this list and then count the number of elements in each group. * @param iterator Group iterator for each element within `list`, return the key to group the element by. * @param context `this` object in `iterator`, optional. * @return An object with the group names as properties where each property contains the number of elements in that group. **/ countBy( list: _.List, iterator?: _.ListIterator, context?: any): _.Dictionary; /** * @see _.countBy * @param iterator Function name **/ countBy( list: _.List, iterator: string, context?: any): _.Dictionary; /** * Returns a shuffled copy of the list, using a version of the Fisher-Yates shuffle. * @param list List to shuffle. * @return Shuffled copy of `list`. **/ shuffle(list: _.Collection): T[]; /** * Produce a random sample from the `list`. Pass a number to return `n` random elements from the list. Otherwise a single random item will be returned. * @param list List to sample. * @return Random sample of `n` elements in `list`. **/ sample(list: _.Collection, n: number): T[]; /** * @see _.sample **/ sample(list: _.Collection): T; /** * Converts the list (anything that can be iterated over), into a real Array. Useful for transmuting * the arguments object. * @param list object to transform into an array. * @return `list` as an array. **/ toArray(list: _.Collection): T[]; /** * Return the number of values in the list. * @param list Count the number of values/elements in this list. * @return Number of values in `list`. **/ size(list: _.Collection): number; /** * Split array into two arrays: * one whose elements all satisfy predicate and one whose elements all do not satisfy predicate. * @param array Array to split in two. * @param iterator Filter iterator function for each element in `array`. * @param context `this` object in `iterator`, optional. * @return Array where Array[0] are the elements in `array` that satisfies the predicate, and Array[1] the elements that did not. **/ partition( array: Array, iterator: _.ListIterator, context?: any): T[][]; /********* * Arrays * **********/ /** * Returns the first element of an array. Passing n will return the first n elements of the array. * @param array Retrieves the first element of this array. * @return Returns the first element of `array`. **/ first(array: _.List): T; /** * @see _.first * @param n Return more than one element from `array`. **/ first( array: _.List, n: number): T[]; /** * @see _.first **/ head(array: _.List): T; /** * @see _.first **/ head( array: _.List, n: number): T[]; /** * @see _.first **/ take(array: _.List): T; /** * @see _.first **/ take( array: _.List, n: number): T[]; /** * Returns everything but the last entry of the array. Especially useful on the arguments object. * Pass n to exclude the last n elements from the result. * @param array Retrieve all elements except the last `n`. * @param n Leaves this many elements behind, optional. * @return Returns everything but the last `n` elements of `array`. **/ initial( array: _.List, n?: number): T[]; /** * Returns the last element of an array. Passing n will return the last n elements of the array. * @param array Retrieves the last element of this array. * @return Returns the last element of `array`. **/ last(array: _.List): T; /** * @see _.last * @param n Return more than one element from `array`. **/ last( array: _.List, n: number): T[]; /** * Returns the rest of the elements in an array. Pass an index to return the values of the array * from that index onward. * @param array The array to retrieve all but the first `index` elements. * @param n The index to start retrieving elements forward from, optional, default = 1. * @return Returns the elements of `array` from `index` to the end of `array`. **/ rest( array: _.List, n?: number): T[]; /** * @see _.rest **/ tail( array: _.List, n?: number): T[]; /** * @see _.rest **/ drop( array: _.List, n?: number): T[]; /** * Returns a copy of the array with all falsy values removed. In JavaScript, false, null, 0, "", * undefined and NaN are all falsy. * @param array Array to compact. * @return Copy of `array` without false values. **/ compact(array: _.List): T[]; /** * Flattens a nested array (the nesting can be to any depth). If you pass shallow, the array will * only be flattened a single level. * @param array The array to flatten. * @param shallow If true then only flatten one level, optional, default = false. * @return `array` flattened. **/ flatten( array: _.List, shallow?: boolean): any[]; /** * Returns a copy of the array with all instances of the values removed. * @param array The array to remove `values` from. * @param values The values to remove from `array`. * @return Copy of `array` without `values`. **/ without( array: _.List, ...values: T[]): T[]; /** * Computes the union of the passed-in arrays: the list of unique items, in order, that are * present in one or more of the arrays. * @param arrays Array of arrays to compute the union of. * @return The union of elements within `arrays`. **/ union(...arrays: _.List[]): T[]; /** * Computes the list of values that are the intersection of all the arrays. Each value in the result * is present in each of the arrays. * @param arrays Array of arrays to compute the intersection of. * @return The intersection of elements within `arrays`. **/ intersection(...arrays: _.List[]): T[]; /** * Similar to without, but returns the values from array that are not present in the other arrays. * @param array Keeps values that are within `others`. * @param others The values to keep within `array`. * @return Copy of `array` with only `others` values. **/ difference( array: _.List, ...others: _.List[]): T[]; /** * Produces a duplicate-free version of the array, using === to test object equality. If you know in * advance that the array is sorted, passing true for isSorted will run a much faster algorithm. If * you want to compute unique items based on a transformation, pass an iterator function. * @param array Array to remove duplicates from. * @param isSorted True if `array` is already sorted, optional, default = false. * @param iterator Transform the elements of `array` before comparisons for uniqueness. * @param context 'this' object in `iterator`, optional. * @return Copy of `array` where all elements are unique. **/ uniq( array: _.List, isSorted?: boolean, iterator?: _.ListIterator, context?: any): T[]; /** * @see _.uniq **/ uniq( array: _.List, iterator?: _.ListIterator, context?: any): T[]; /** * @see _.uniq **/ unique( array: _.List, iterator?: _.ListIterator, context?: any): T[]; /** * @see _.uniq **/ unique( array: _.List, isSorted?: boolean, iterator?: _.ListIterator, context?: any): T[]; /** * Merges together the values of each of the arrays with the values at the corresponding position. * Useful when you have separate data sources that are coordinated through matching array indexes. * If you're working with a matrix of nested arrays, zip.apply can transpose the matrix in a similar fashion. * @param arrays The arrays to merge/zip. * @return Zipped version of `arrays`. **/ zip(...arrays: any[][]): any[][]; /** * @see _.zip **/ zip(...arrays: any[]): any[]; /** * Converts arrays into objects. Pass either a single list of [key, value] pairs, or a * list of keys, and a list of values. * @param keys Key array. * @param values Value array. * @return An object containing the `keys` as properties and `values` as the property values. **/ object( keys: _.List, values: _.List): TResult; /** * Converts arrays into objects. Pass either a single list of [key, value] pairs, or a * list of keys, and a list of values. * @param keyValuePairs Array of [key, value] pairs. * @return An object containing the `keys` as properties and `values` as the property values. **/ object(...keyValuePairs: any[][]): TResult; /** * @see _.object **/ object( list: _.List, values?: any): TResult; /** * Returns the index at which value can be found in the array, or -1 if value is not present in the array. * Uses the native indexOf function unless it's missing. If you're working with a large array, and you know * that the array is already sorted, pass true for isSorted to use a faster binary search ... or, pass a number * as the third argument in order to look for the first matching value in the array after the given index. * @param array The array to search for the index of `value`. * @param value The value to search for within `array`. * @param isSorted True if the array is already sorted, optional, default = false. * @return The index of `value` within `array`. **/ indexOf( array: _.List, value: T, isSorted?: boolean): number; /** * @see _indexof **/ indexOf( array: _.List, value: T, startFrom: number): number; /** * Returns the index of the last occurrence of value in the array, or -1 if value is not present. Uses the * native lastIndexOf function if possible. Pass fromIndex to start your search at a given index. * @param array The array to search for the last index of `value`. * @param value The value to search for within `array`. * @param from The starting index for the search, optional. * @return The index of the last occurrence of `value` within `array`. **/ lastIndexOf( array: _.List, value: T, from?: number): number; /** * Uses a binary search to determine the index at which the value should be inserted into the list in order * to maintain the list's sorted order. If an iterator is passed, it will be used to compute the sort ranking * of each value, including the value you pass. * @param list The sorted list. * @param value The value to determine its index within `list`. * @param iterator Iterator to compute the sort ranking of each value, optional. * @return The index where `value` should be inserted into `list`. **/ sortedIndex( list: _.List, value: T, iterator?: (x: T) => TSort, context?: any): number; /** * A function to create flexibly-numbered lists of integers, handy for each and map loops. start, if omitted, * defaults to 0; step defaults to 1. Returns a list of integers from start to stop, incremented (or decremented) * by step, exclusive. * @param start Start here. * @param stop Stop here. * @param step The number to count up by each iteration, optional, default = 1. * @return Array of numbers from `start` to `stop` with increments of `step`. **/ range( start: number, stop: number, step?: number): number[]; /** * @see _.range * @param stop Stop here. * @return Array of numbers from 0 to `stop` with increments of 1. * @note If start is not specified the implementation will never pull the step (step = arguments[2] || 0) **/ range(stop: number): number[]; /************* * Functions * *************/ /** * Bind a function to an object, meaning that whenever the function is called, the value of this will * be the object. Optionally, bind arguments to the function to pre-fill them, also known as partial application. * @param func The function to bind `this` to `object`. * @param context The `this` pointer whenever `fn` is called. * @param arguments Additional arguments to pass to `fn` when called. * @return `fn` with `this` bound to `object`. **/ bind( func: Function, context: any, ...arguments: any[]): () => any; /** * Binds a number of methods on the object, specified by methodNames, to be run in the context of that object * whenever they are invoked. Very handy for binding functions that are going to be used as event handlers, * which would otherwise be invoked with a fairly useless this. If no methodNames are provided, all of the * object's function properties will be bound to it. * @param object The object to bind the methods `methodName` to. * @param methodNames The methods to bind to `object`, optional and if not provided all of `object`'s * methods are bound. **/ bindAll( object: any, ...methodNames: string[]): any; /** * Partially apply a function by filling in any number of its arguments, without changing its dynamic this value. * A close cousin of bind. You may pass _ in your list of arguments to specify an argument that should not be * pre-filled, but left open to supply at call-time. * @param fn Function to partially fill in arguments. * @param arguments The partial arguments. * @return `fn` with partially filled in arguments. **/ partial( fn: Function, ...arguments: any[]): Function; /** * Memoizes a given function by caching the computed result. Useful for speeding up slow-running computations. * If passed an optional hashFunction, it will be used to compute the hash key for storing the result, based * on the arguments to the original function. The default hashFunction just uses the first argument to the * memoized function as the key. * @param fn Computationally expensive function that will now memoized results. * @param hashFn Hash function for storing the result of `fn`. * @return Memoized version of `fn`. **/ memoize( fn: Function, hashFn?: (...args: any[]) => string): Function; /** * Much like setTimeout, invokes function after wait milliseconds. If you pass the optional arguments, * they will be forwarded on to the function when it is invoked. * @param func Function to delay `waitMS` amount of ms. * @param wait The amount of milliseconds to delay `fn`. * @arguments Additional arguments to pass to `fn`. **/ delay( func: Function, wait: number, ...arguments: any[]): any; /** * @see _delay **/ delay( func: Function, ...arguments: any[]): any; /** * Defers invoking the function until the current call stack has cleared, similar to using setTimeout * with a delay of 0. Useful for performing expensive computations or HTML rendering in chunks without * blocking the UI thread from updating. If you pass the optional arguments, they will be forwarded on * to the function when it is invoked. * @param fn The function to defer. * @param arguments Additional arguments to pass to `fn`. **/ defer( fn: Function, ...arguments: any[]): void; /** * Creates and returns a new, throttled version of the passed function, that, when invoked repeatedly, * will only actually call the original function at most once per every wait milliseconds. Useful for * rate-limiting events that occur faster than you can keep up with. * By default, throttle will execute the function as soon as you call it for the first time, and, * if you call it again any number of times during the wait period, as soon as that period is over. * If you'd like to disable the leading-edge call, pass {leading: false}, and if you'd like to disable * the execution on the trailing-edge, pass {trailing: false}. * @param func Function to throttle `waitMS` ms. * @param wait The number of milliseconds to wait before `fn` can be invoked again. * @param options Allows for disabling execution of the throttled function on either the leading or trailing edge. * @return `fn` with a throttle of `wait`. **/ throttle( func: any, wait: number, options?: _.ThrottleSettings): Function; /** * Creates and returns a new debounced version of the passed function that will postpone its execution * until after wait milliseconds have elapsed since the last time it was invoked. Useful for implementing * behavior that should only happen after the input has stopped arriving. For example: rendering a preview * of a Markdown comment, recalculating a layout after the window has stopped being resized, and so on. * * Pass true for the immediate parameter to cause debounce to trigger the function on the leading instead * of the trailing edge of the wait interval. Useful in circumstances like preventing accidental double *-clicks on a "submit" button from firing a second time. * @param fn Function to debounce `waitMS` ms. * @param wait The number of milliseconds to wait before `fn` can be invoked again. * @param immediate True if `fn` should be invoked on the leading edge of `waitMS` instead of the trailing edge. * @return Debounced version of `fn` that waits `wait` ms when invoked. **/ debounce( fn: Function, wait: number, immediate?: boolean): Function; /** * Creates a version of the function that can only be called one time. Repeated calls to the modified * function will have no effect, returning the value from the original call. Useful for initialization * functions, instead of having to set a boolean flag and then check it later. * @param fn Function to only execute once. * @return Copy of `fn` that can only be invoked once. **/ once(fn: Function): Function; /** * Creates a version of the function that will only be run after first being called count times. Useful * for grouping asynchronous responses, where you want to be sure that all the async calls have finished, * before proceeding. * @param count Number of times to be called before actually executing. * @fn The function to defer execution `count` times. * @return Copy of `fn` that will not execute until it is invoked `count` times. **/ after( count: number, fn: Function): Function; /** * Wraps the first function inside of the wrapper function, passing it as the first argument. This allows * the wrapper to execute code before and after the function runs, adjust the arguments, and execute it * conditionally. * @param fn Function to wrap. * @param wrapper The function that will wrap `fn`. * @return Wrapped version of `fn. **/ wrap( fn: Function, wrapper: (fn: Function, ...args: any[]) => any): Function; /** * Returns the composition of a list of functions, where each function consumes the return value of the * function that follows. In math terms, composing the functions f(), g(), and h() produces f(g(h())). * @param functions List of functions to compose. * @return Composition of `functions`. **/ compose(...functions: Function[]): Function; /********** * Objects * ***********/ /** * Retrieve all the names of the object's properties. * @param object Retrieve the key or property names from this object. * @return List of all the property names on `object`. **/ keys(object: any): string[]; /** * Return all of the values of the object's properties. * @param object Retrieve the values of all the properties on this object. * @return List of all the values on `object`. **/ values(object: any): any[]; /** * Convert an object into a list of [key, value] pairs. * @param object Convert this object to a list of [key, value] pairs. * @return List of [key, value] pairs on `object`. **/ pairs(object: any): any[][]; /** * Returns a copy of the object where the keys have become the values and the values the keys. * For this to work, all of your object's values should be unique and string serializable. * @param object Object to invert key/value pairs. * @return An inverted key/value paired version of `object`. **/ invert(object: any): any; /** * Returns a sorted list of the names of every method in an object - that is to say, * the name of every function property of the object. * @param object Object to pluck all function property names from. * @return List of all the function names on `object`. **/ functions(object: any): string[]; /** * @see _functions **/ methods(object: any): string[]; /** * Copy all of the properties in the source objects over to the destination object, and return * the destination object. It's in-order, so the last source will override properties of the * same name in previous arguments. * @param destination Object to extend all the properties from `sources`. * @param sources Extends `destination` with all properties from these source objects. * @return `destination` extended with all the properties from the `sources` objects. **/ extend( destination: any, ...sources: any[]): any; /** * Return a copy of the object, filtered to only have values for the whitelisted keys * (or array of valid keys). * @param object Object to strip unwanted key/value pairs. * @keys The key/value pairs to keep on `object`. * @return Copy of `object` with only the `keys` properties. **/ pick( object: any, ...keys: string[]): any; /** * Return a copy of the object, filtered to omit the blacklisted keys (or array of keys). * @param object Object to strip unwanted key/value pairs. * @param keys The key/value pairs to remove on `object`. * @return Copy of `object` without the `keys` properties. **/ omit( object: any, ...keys: string[]): any; /** * @see _.omit **/ omit( object: any, keys: string[]): any; /** * Fill in null and undefined properties in object with values from the defaults objects, * and return the object. As soon as the property is filled, further defaults will have no effect. * @param object Fill this object with default values. * @param defaults The default values to add to `object`. * @return `object` with added `defaults` values. **/ defaults( object: any, ...defaults: any[]): any; /** * Create a shallow-copied clone of the object. * Any nested objects or arrays will be copied by reference, not duplicated. * @param object Object to clone. * @return Copy of `object`. **/ clone(object: T): T; /** * Invokes interceptor with the object, and then returns object. The primary purpose of this method * is to "tap into" a method chain, in order to perform operations on intermediate results within the chain. * @param object Argument to `interceptor`. * @param intercepter The function to modify `object` before continuing the method chain. * @return Modified `object`. **/ tap(object: T, intercepter: Function): T; /** * Does the object contain the given key? Identical to object.hasOwnProperty(key), but uses a safe * reference to the hasOwnProperty function, in case it's been overridden accidentally. * @param object Object to check for `key`. * @param key The key to check for on `object`. * @return True if `key` is a property on `object`, otherwise false. **/ has(object: any, key: string): boolean; /** * Returns a predicate function that will tell you if a passed in object contains all of the key/value properties present in attrs. * @param attrs Object with key values pair * @return Predicate function **/ matches(attrs: T): _.ListIterator; /** * Returns a function that will itself return the key property of any passed-in object. * @param key Property of the object. * @return Function which accept an object an returns the value of key in that object. **/ property(key: string): (object: Object) => any; /** * Performs an optimized deep comparison between the two objects, * to determine if they should be considered equal. * @param object Compare to `other`. * @param other Compare to `object`. * @return True if `object` is equal to `other`. **/ isEqual(object: any, other: any): boolean; /** * Returns true if object contains no values. * @param object Check if this object has no properties or values. * @return True if `object` is empty. **/ isEmpty(object: any): boolean; /** * Returns true if object is a DOM element. * @param object Check if this object is a DOM element. * @return True if `object` is a DOM element, otherwise false. **/ isElement(object: any): boolean; /** * Returns true if object is an Array. * @param object Check if this object is an Array. * @return True if `object` is an Array, otherwise false. **/ isArray(object: any): boolean; /** * Returns true if value is an Object. Note that JavaScript arrays and functions are objects, * while (normal) strings and numbers are not. * @param object Check if this object is an Object. * @return True of `object` is an Object, otherwise false. **/ isObject(object: any): boolean; /** * Returns true if object is an Arguments object. * @param object Check if this object is an Arguments object. * @return True if `object` is an Arguments object, otherwise false. **/ isArguments(object: any): boolean; /** * Returns true if object is a Function. * @param object Check if this object is a Function. * @return True if `object` is a Function, otherwise false. **/ isFunction(object: any): boolean; /** * Returns true if object is a String. * @param object Check if this object is a String. * @return True if `object` is a String, otherwise false. **/ isString(object: any): boolean; /** * Returns true if object is a Number (including NaN). * @param object Check if this object is a Number. * @return True if `object` is a Number, otherwise false. **/ isNumber(object: any): boolean; /** * Returns true if object is a finite Number. * @param object Check if this object is a finite Number. * @return True if `object` is a finite Number. **/ isFinite(object: any): boolean; /** * Returns true if object is either true or false. * @param object Check if this object is a bool. * @return True if `object` is a bool, otherwise false. **/ isBoolean(object: any): boolean; /** * Returns true if object is a Date. * @param object Check if this object is a Date. * @return True if `object` is a Date, otherwise false. **/ isDate(object: any): boolean; /** * Returns true if object is a RegExp. * @param object Check if this object is a RegExp. * @return True if `object` is a RegExp, otherwise false. **/ isRegExp(object: any): boolean; /** * Returns true if object is NaN. * Note: this is not the same as the native isNaN function, * which will also return true if the variable is undefined. * @param object Check if this object is NaN. * @return True if `object` is NaN, otherwise false. **/ isNaN(object: any): boolean; /** * Returns true if the value of object is null. * @param object Check if this object is null. * @return True if `object` is null, otherwise false. **/ isNull(object: any): boolean; /** * Returns true if value is undefined. * @param object Check if this object is undefined. * @return True if `object` is undefined, otherwise false. **/ isUndefined(value: any): boolean; /* ********* * Utility * ********** */ /** * Give control of the "_" variable back to its previous owner. * Returns a reference to the Underscore object. * @return Underscore object reference. **/ noConflict(): any; /** * Returns the same value that is used as the argument. In math: f(x) = x * This function looks useless, but is used throughout Underscore as a default iterator. * @param value Identity of this object. * @return `value`. **/ identity(value: T): T; /** * Creates a function that returns the same value that is used as the argument of _.constant * @param value Identity of this object. * @return Function that return value. **/ constant(value: T): () => T; /** * Invokes the given iterator function n times. * Each invocation of iterator is called with an index argument * @param n Number of times to invoke `iterator`. * @param iterator Function iterator to invoke `n` times. * @param context `this` object in `iterator`, optional. **/ times(n: number, iterator: (n: number) => TResult, context?: any): TResult[]; /** * Returns a random integer between min and max, inclusive. If you only pass one argument, * it will return a number between 0 and that number. * @param max The maximum random number. * @return A random number between 0 and `max`. **/ random(max: number): number; /** * @see _.random * @param min The minimum random number. * @return A random number between `min` and `max`. **/ random(min: number, max: number): number; /** * Allows you to extend Underscore with your own utility functions. Pass a hash of * {name: function} definitions to have your functions added to the Underscore object, * as well as the OOP wrapper. * @param object Mixin object containing key/function pairs to add to the Underscore object. **/ mixin(object: any): void; /** * Generate a globally-unique id for client-side models or DOM elements that need one. * If prefix is passed, the id will be appended to it. Without prefix, returns an integer. * @param prefix A prefix string to start the unique ID with. * @return Unique string ID beginning with `prefix`. **/ uniqueId(prefix: string): string; /** * @see _.uniqueId **/ uniqueId(): number; /** * Escapes a string for insertion into HTML, replacing &, <, >, ", ', and / characters. * @param str Raw string to escape. * @return `str` HTML escaped. **/ escape(str: string): string; /** * The opposite of escape, replaces &, <, >, ", and ' with their unescaped counterparts. * @param str HTML escaped string. * @return `str` Raw string. **/ unescape(str: string): string; /** * If the value of the named property is a function then invoke it; otherwise, return it. * @param object Object to maybe invoke function `property` on. * @param property The function by name to invoke on `object`. * @return The result of invoking the function `property` on `object. **/ result(object: any, property: string): any; /** * Compiles JavaScript templates into functions that can be evaluated for rendering. Useful * for rendering complicated bits of HTML from JSON data sources. Template functions can both * interpolate variables, using <%= ... %>, as well as execute arbitrary JavaScript code, with * <% ... %>. If you wish to interpolate a value, and have it be HTML-escaped, use <%- ... %> When * you evaluate a template function, pass in a data object that has properties corresponding to * the template's free variables. If you're writing a one-off, you can pass the data object as * the second parameter to template in order to render immediately instead of returning a template * function. The settings argument should be a hash containing any _.templateSettings that should * be overridden. * @param templateString Underscore HTML template. * @param data Data to use when compiling `templateString`. * @param settings Settings to use while compiling. * @return Returns the compiled Underscore HTML template. **/ template(templateString: string): (...data: any[]) => string; template(templateString: string, data: any, settings?: _.TemplateSettings): string; /** * By default, Underscore uses ERB-style template delimiters, change the * following template settings to use alternative delimiters. **/ templateSettings: _.TemplateSettings; /** * Returns an integer timestamp for the current time, using the fastest method available in the runtime. Useful for implementing timing/animation functions. **/ now(): number; /* ********** * Chaining * *********** */ /** * Returns a wrapped object. Calling methods on this object will continue to return wrapped objects * until value() is used. * @param obj Object to chain. * @return Wrapped `obj`. **/ chain(obj: T[]): _Chain; chain(obj: T): _Chain; /** * Extracts the value of a wrapped object. * @param obj Wrapped object to extract the value from. * @return Value of `obj`. **/ value(obj: T): TResult; } interface Underscore { /* ************* * Collections * ************* */ /** * Wrapped type `any[]`. * @see _.each **/ each(iterator: _.ListIterator, context?: any): T[]; /** * @see _.each **/ each(iterator: _.ObjectIterator, context?: any): T[]; /** * @see _.each **/ forEach(iterator: _.ListIterator, context?: any): T[]; /** * @see _.each **/ forEach(iterator: _.ObjectIterator, context?: any): T[]; /** * Wrapped type `any[]`. * @see _.map **/ map(iterator: _.ListIterator, context?: any): TResult[]; /** * Wrapped type `any[]`. * @see _.map **/ map(iterator: _.ObjectIterator, context?: any): TResult[]; /** * @see _.map **/ collect(iterator: _.ListIterator, context?: any): TResult[]; /** * @see _.map **/ collect(iterator: _.ObjectIterator, context?: any): TResult[]; /** * Wrapped type `any[]`. * @see _.reduce **/ reduce(iterator: _.MemoIterator, memo?: TResult, context?: any): TResult; /** * @see _.reduce **/ inject(iterator: _.MemoIterator, memo?: TResult, context?: any): TResult; /** * @see _.reduce **/ foldl(iterator: _.MemoIterator, memo?: TResult, context?: any): TResult; /** * Wrapped type `any[]`. * @see _.reduceRight **/ reduceRight(iterator: _.MemoIterator, memo?: TResult, context?: any): TResult; /** * @see _.reduceRight **/ foldr(iterator: _.MemoIterator, memo?: TResult, context?: any): TResult; /** * Wrapped type `any[]`. * @see _.find **/ find(iterator: _.ListIterator, context?: any): T; /** * @see _.find **/ detect(iterator: _.ListIterator, context?: any): T; /** * Wrapped type `any[]`. * @see _.filter **/ filter(iterator: _.ListIterator, context?: any): T[]; /** * @see _.filter **/ select(iterator: _.ListIterator, context?: any): T[]; /** * Wrapped type `any[]`. * @see _.where **/ where(properties: U): T[]; /** * Wrapped type `any[]`. * @see _.findWhere **/ findWhere(properties: U): T; /** * Wrapped type `any[]`. * @see _.reject **/ reject(iterator: _.ListIterator, context?: any): T[]; /** * Wrapped type `any[]`. * @see _.all **/ all(iterator?: _.ListIterator, context?: any): boolean; /** * @see _.all **/ every(iterator?: _.ListIterator, context?: any): boolean; /** * Wrapped type `any[]`. * @see _.any **/ any(iterator?: _.ListIterator, context?: any): boolean; /** * @see _.any **/ some(iterator?: _.ListIterator, context?: any): boolean; /** * Wrapped type `any[]`. * @see _.contains **/ contains(value: T): boolean; /** * Alias for 'contains'. * @see contains **/ include(value: T): boolean; /** * Wrapped type `any[]`. * @see _.invoke **/ invoke(methodName: string, ...arguments: any[]): any; /** * Wrapped type `any[]`. * @see _.pluck **/ pluck(propertyName: string): any[]; /** * Wrapped type `number[]`. * @see _.max **/ max(): number; /** * Wrapped type `any[]`. * @see _.max **/ max(iterator: _.ListIterator, context?: any): T; /** * Wrapped type `any[]`. * @see _.max **/ max(iterator?: _.ListIterator, context?: any): T; /** * Wrapped type `number[]`. * @see _.min **/ min(): number; /** * Wrapped type `any[]`. * @see _.min **/ min(iterator: _.ListIterator, context?: any): T; /** * Wrapped type `any[]`. * @see _.min **/ min(iterator?: _.ListIterator, context?: any): T; /** * Wrapped type `any[]`. * @see _.sortBy **/ sortBy(iterator?: _.ListIterator, context?: any): T[]; /** * Wrapped type `any[]`. * @see _.sortBy **/ sortBy(iterator: string, context?: any): T[]; /** * Wrapped type `any[]`. * @see _.groupBy **/ groupBy(iterator?: _.ListIterator, context?: any): _.Dictionary<_.List>; /** * Wrapped type `any[]`. * @see _.groupBy **/ groupBy(iterator: string, context?: any): _.Dictionary; /** * Wrapped type `any[]`. * @see _.indexBy **/ indexBy(iterator: _.ListIterator, context?: any): _.Dictionary; /** * Wrapped type `any[]`. * @see _.indexBy **/ indexBy(iterator: string, context?: any): _.Dictionary; /** * Wrapped type `any[]`. * @see _.countBy **/ countBy(iterator?: _.ListIterator, context?: any): _.Dictionary; /** * Wrapped type `any[]`. * @see _.countBy **/ countBy(iterator: string, context?: any): _.Dictionary; /** * Wrapped type `any[]`. * @see _.shuffle **/ shuffle(): T[]; /** * Wrapped type `any[]`. * @see _.sample **/ sample(n: number): T[]; /** * @see _.sample **/ sample(): T; /** * Wrapped type `any`. * @see _.toArray **/ toArray(): T[]; /** * Wrapped type `any`. * @see _.size **/ size(): number; /********* * Arrays * **********/ /** * Wrapped type `any[]`. * @see _.first **/ first(): T; /** * Wrapped type `any[]`. * @see _.first **/ first(n: number): T[]; /** * @see _.first **/ head(): T; /** * @see _.first **/ head(n: number): T[]; /** * @see _.first **/ take(): T; /** * @see _.first **/ take(n: number): T[]; /** * Wrapped type `any[]`. * @see _.initial **/ initial(n?: number): T[]; /** * Wrapped type `any[]`. * @see _.last **/ last(): T; /** * Wrapped type `any[]`. * @see _.last **/ last(n: number): T[]; /** * Wrapped type `any[]`. * @see _.rest **/ rest(n?: number): T[]; /** * @see _.rest **/ tail(n?: number): T[]; /** * @see _.rest **/ drop(n?: number): T[]; /** * Wrapped type `any[]`. * @see _.compact **/ compact(): T[]; /** * Wrapped type `any`. * @see _.flatten **/ flatten(shallow?: boolean): any[]; /** * Wrapped type `any[]`. * @see _.without **/ without(...values: T[]): T[]; /** * Wrapped type `any[]`. * @see _.partition **/ partition(iterator: _.ListIterator, context?: any): T[][]; /** * Wrapped type `any[][]`. * @see _.union **/ union(...arrays: _.List[]): T[]; /** * Wrapped type `any[][]`. * @see _.intersection **/ intersection(...arrays: _.List[]): T[]; /** * Wrapped type `any[]`. * @see _.difference **/ difference(...others: _.List[]): T[]; /** * Wrapped type `any[]`. * @see _.uniq **/ uniq(isSorted?: boolean, iterator?: _.ListIterator): T[]; /** * Wrapped type `any[]`. * @see _.uniq **/ uniq(iterator?: _.ListIterator, context?: any): T[]; /** * @see _.uniq **/ unique(isSorted?: boolean, iterator?: _.ListIterator): T[]; /** * @see _.uniq **/ unique(iterator?: _.ListIterator, context?: any): T[]; /** * Wrapped type `any[][]`. * @see _.zip **/ zip(...arrays: any[][]): any[][]; /** * Wrapped type `any[][]`. * @see _.object **/ object(...keyValuePairs: any[][]): any; /** * @see _.object **/ object(values?: any): any; /** * Wrapped type `any[]`. * @see _.indexOf **/ indexOf(value: T, isSorted?: boolean): number; /** * @see _.indexOf **/ indexOf(value: T, startFrom: number): number; /** * Wrapped type `any[]`. * @see _.lastIndexOf **/ lastIndexOf(value: T, from?: number): number; /** * Wrapped type `any[]`. * @see _.sortedIndex **/ sortedIndex(value: T, iterator?: (x: T) => any, context?: any): number; /** * Wrapped type `number`. * @see _.range **/ range(stop: number, step?: number): number[]; /** * Wrapped type `number`. * @see _.range **/ range(): number[]; /* *********** * Functions * ************ */ /** * Wrapped type `Function`. * @see _.bind **/ bind(object: any, ...arguments: any[]): Function; /** * Wrapped type `object`. * @see _.bindAll **/ bindAll(...methodNames: string[]): any; /** * Wrapped type `Function`. * @see _.partial **/ partial(...arguments: any[]): Function; /** * Wrapped type `Function`. * @see _.memoize **/ memoize(hashFn?: (n: any) => string): Function; /** * Wrapped type `Function`. * @see _.defer **/ defer(...arguments: any[]): void; /** * Wrapped type `Function`. * @see _.delay **/ delay(wait: number, ...arguments: any[]): any; /** * @see _.delay **/ delay(...arguments: any[]): any; /** * Wrapped type `Function`. * @see _.throttle **/ throttle(wait: number, options?: _.ThrottleSettings): Function; /** * Wrapped type `Function`. * @see _.debounce **/ debounce(wait: number, immediate?: boolean): Function; /** * Wrapped type `Function`. * @see _.once **/ once(): Function; /** * Wrapped type `number`. * @see _.after **/ after(func: Function): Function; /** * Wrapped type `Function`. * @see _.wrap **/ wrap(wrapper: Function): () => Function; /** * Wrapped type `Function[]`. * @see _.compose **/ compose(...functions: Function[]): Function; /********* * * Objects * ********** */ /** * Wrapped type `object`. * @see _.keys **/ keys(): string[]; /** * Wrapped type `object`. * @see _.values **/ values(): T[]; /** * Wrapped type `object`. * @see _.pairs **/ pairs(): any[][]; /** * Wrapped type `object`. * @see _.invert **/ invert(): any; /** * Wrapped type `object`. * @see _.functions **/ functions(): string[]; /** * @see _.functions **/ methods(): string[]; /** * Wrapped type `object`. * @see _.extend **/ extend(...sources: any[]): any; /** * Wrapped type `object`. * @see _.pick **/ pick(...keys: string[]): any; pick(keys: string[]): any; /** * Wrapped type `object`. * @see _.omit **/ omit(...keys: string[]): any; omit(keys: string[]): any; /** * Wrapped type `object`. * @see _.defaults **/ defaults(...defaults: any[]): any; /** * Wrapped type `any[]`. * @see _.clone **/ clone(): T; /** * Wrapped type `object`. * @see _.tap **/ tap(interceptor: (...as: any[]) => any): any; /** * Wrapped type `object`. * @see _.has **/ has(key: string): boolean; /** * Wrapped type `any[]`. * @see _.matches **/ matches(): _.ListIterator; /** * Wrapped type `string`. * @see _.property **/ property(): (object: Object) => any; /** * Wrapped type `object`. * @see _.isEqual **/ isEqual(other: any): boolean; /** * Wrapped type `object`. * @see _.isEmpty **/ isEmpty(): boolean; /** * Wrapped type `object`. * @see _.isElement **/ isElement(): boolean; /** * Wrapped type `object`. * @see _.isArray **/ isArray(): boolean; /** * Wrapped type `object`. * @see _.isObject **/ isObject(): boolean; /** * Wrapped type `object`. * @see _.isArguments **/ isArguments(): boolean; /** * Wrapped type `object`. * @see _.isFunction **/ isFunction(): boolean; /** * Wrapped type `object`. * @see _.isString **/ isString(): boolean; /** * Wrapped type `object`. * @see _.isNumber **/ isNumber(): boolean; /** * Wrapped type `object`. * @see _.isFinite **/ isFinite(): boolean; /** * Wrapped type `object`. * @see _.isBoolean **/ isBoolean(): boolean; /** * Wrapped type `object`. * @see _.isDate **/ isDate(): boolean; /** * Wrapped type `object`. * @see _.isRegExp **/ isRegExp(): boolean; /** * Wrapped type `object`. * @see _.isNaN **/ isNaN(): boolean; /** * Wrapped type `object`. * @see _.isNull **/ isNull(): boolean; /** * Wrapped type `object`. * @see _.isUndefined **/ isUndefined(): boolean; /********* * * Utility * ********** */ /** * Wrapped type `any`. * @see _.identity **/ identity(): any; /** * Wrapped type `any`. * @see _.constant **/ constant(): () => T; /** * Wrapped type `number`. * @see _.times **/ times(iterator: (n: number) => TResult, context?: any): TResult[]; /** * Wrapped type `number`. * @see _.random **/ random(): number; /** * Wrapped type `number`. * @see _.random **/ random(max: number): number; /** * Wrapped type `object`. * @see _.mixin **/ mixin(): void; /** * Wrapped type `string`. * @see _.uniqueId **/ uniqueId(): string; /** * Wrapped type `string`. * @see _.escape **/ escape(): string; /** * Wrapped type `string`. * @see _.unescape **/ unescape(): string; /** * Wrapped type `object`. * @see _.result **/ result(property: string): any; /** * Wrapped type `string`. * @see _.template **/ template(data?: any, settings?: _.TemplateSettings): (...data: any[]) => string; /********** * * Chaining * *********** */ /** * Wrapped type `any`. * @see _.chain **/ chain(): _Chain; /** * Wrapped type `any`. * @see _.value **/ value(): TResult; } interface _Chain { /* ************* * Collections * ************* */ /** * Wrapped type `any[]`. * @see _.each **/ each(iterator: _.ListIterator, context?: any): _Chain; /** * @see _.each **/ each(iterator: _.ObjectIterator, context?: any): _Chain; /** * @see _.each **/ forEach(iterator: _.ListIterator, context?: any): _Chain; /** * @see _.each **/ forEach(iterator: _.ObjectIterator, context?: any): _Chain; /** * Wrapped type `any[]`. * @see _.map **/ map(iterator: _.ListIterator, context?: any): _ChainOfArrays; /** * Wrapped type `any[]`. * @see _.map **/ map(iterator: _.ListIterator, context?: any): _Chain; /** * Wrapped type `any[]`. * @see _.map **/ map(iterator: _.ObjectIterator, context?: any): _ChainOfArrays; /** * Wrapped type `any[]`. * @see _.map **/ map(iterator: _.ObjectIterator, context?: any): _Chain; /** * @see _.map **/ collect(iterator: _.ListIterator, context?: any): _Chain; /** * @see _.map **/ collect(iterator: _.ObjectIterator, context?: any): _Chain; /** * Wrapped type `any[]`. * @see _.reduce **/ reduce(iterator: _.MemoIterator, memo?: TResult, context?: any): _Chain; /** * @see _.reduce **/ inject(iterator: _.MemoIterator, memo?: TResult, context?: any): _Chain; /** * @see _.reduce **/ foldl(iterator: _.MemoIterator, memo?: TResult, context?: any): _Chain; /** * Wrapped type `any[]`. * @see _.reduceRight **/ reduceRight(iterator: _.MemoIterator, memo?: TResult, context?: any): _Chain; /** * @see _.reduceRight **/ foldr(iterator: _.MemoIterator, memo?: TResult, context?: any): _Chain; /** * Wrapped type `any[]`. * @see _.find **/ find(iterator: _.ListIterator, context?: any): _ChainSingle; /** * @see _.find **/ detect(iterator: _.ListIterator, context?: any): _Chain; /** * Wrapped type `any[]`. * @see _.filter **/ filter(iterator: _.ListIterator, context?: any): _Chain; /** * @see _.filter **/ select(iterator: _.ListIterator, context?: any): _Chain; /** * Wrapped type `any[]`. * @see _.where **/ where(properties: U): _Chain; /** * Wrapped type `any[]`. * @see _.findWhere **/ findWhere(properties: U): _ChainSingle; /** * Wrapped type `any[]`. * @see _.reject **/ reject(iterator: _.ListIterator, context?: any): _Chain; /** * Wrapped type `any[]`. * @see _.all **/ all(iterator?: _.ListIterator, context?: any): _Chain; /** * @see _.all **/ every(iterator?: _.ListIterator, context?: any): _Chain; /** * Wrapped type `any[]`. * @see _.any **/ any(iterator?: _.ListIterator, context?: any): _Chain; /** * @see _.any **/ some(iterator?: _.ListIterator, context?: any): _Chain; /** * Wrapped type `any[]`. * @see _.contains **/ contains(value: T): _Chain; /** * Alias for 'contains'. * @see contains **/ include(value: T): _Chain; /** * Wrapped type `any[]`. * @see _.invoke **/ invoke(methodName: string, ...arguments: any[]): _Chain; /** * Wrapped type `any[]`. * @see _.pluck **/ pluck(propertyName: string): _Chain; /** * Wrapped type `number[]`. * @see _.max **/ max(): _ChainSingle; /** * Wrapped type `any[]`. * @see _.max **/ max(iterator: _.ListIterator, context?: any): _ChainSingle; /** * Wrapped type `any[]`. * @see _.max **/ max(iterator?: _.ListIterator, context?: any): _ChainSingle; /** * Wrapped type `number[]`. * @see _.min **/ min(): _ChainSingle; /** * Wrapped type `any[]`. * @see _.min **/ min(iterator: _.ListIterator, context?: any): _ChainSingle; /** * Wrapped type `any[]`. * @see _.min **/ min(iterator?: _.ListIterator, context?: any): _ChainSingle; /** * Wrapped type `any[]`. * @see _.sortBy **/ sortBy(iterator?: _.ListIterator, context?: any): _Chain; /** * Wrapped type `any[]`. * @see _.sortBy **/ sortBy(iterator: string, context?: any): _Chain; /** * Wrapped type `any[]`. * @see _.groupBy **/ groupBy(iterator?: _.ListIterator, context?: any): _Chain; /** * Wrapped type `any[]`. * @see _.groupBy **/ groupBy(iterator: string, context?: any): _Chain; /** * Wrapped type `any[]`. * @see _.indexBy **/ indexBy(iterator: _.ListIterator, context?: any): _Chain; /** * Wrapped type `any[]`. * @see _.indexBy **/ indexBy(iterator: string, context?: any): _Chain; /** * Wrapped type `any[]`. * @see _.countBy **/ countBy(iterator?: _.ListIterator, context?: any): _Chain; /** * Wrapped type `any[]`. * @see _.countBy **/ countBy(iterator: string, context?: any): _Chain; /** * Wrapped type `any[]`. * @see _.shuffle **/ shuffle(): _Chain; /** * Wrapped type `any[]`. * @see _.sample **/ sample(n: number): _Chain; /** * @see _.sample **/ sample(): _Chain; /** * Wrapped type `any`. * @see _.toArray **/ toArray(): _Chain; /** * Wrapped type `any`. * @see _.size **/ size(): _Chain; /********* * Arrays * **********/ /** * Wrapped type `any[]`. * @see _.first **/ first(): _ChainSingle; /** * Wrapped type `any[]`. * @see _.first **/ first(n: number): _Chain; /** * @see _.first **/ head(): _Chain; /** * @see _.first **/ head(n: number): _Chain; /** * @see _.first **/ take(): _Chain; /** * @see _.first **/ take(n: number): _Chain; /** * Wrapped type `any[]`. * @see _.initial **/ initial(n?: number): _Chain; /** * Wrapped type `any[]`. * @see _.last **/ last(): _Chain; /** * Wrapped type `any[]`. * @see _.last **/ last(n: number): _Chain; /** * Wrapped type `any[]`. * @see _.rest **/ rest(n?: number): _Chain; /** * @see _.rest **/ tail(n?: number): _Chain; /** * @see _.rest **/ drop(n?: number): _Chain; /** * Wrapped type `any[]`. * @see _.compact **/ compact(): _Chain; /** * Wrapped type `any`. * @see _.flatten **/ flatten(shallow?: boolean): _Chain; /** * Wrapped type `any[]`. * @see _.without **/ without(...values: T[]): _Chain; /** * Wrapped type `any[]`. * @see _.partition **/ partition(iterator: _.ListIterator, context?: any): _Chain; /** * Wrapped type `any[][]`. * @see _.union **/ union(...arrays: _.List[]): _Chain; /** * Wrapped type `any[][]`. * @see _.intersection **/ intersection(...arrays: _.List[]): _Chain; /** * Wrapped type `any[]`. * @see _.difference **/ difference(...others: _.List[]): _Chain; /** * Wrapped type `any[]`. * @see _.uniq **/ uniq(isSorted?: boolean, iterator?: _.ListIterator): _Chain; /** * Wrapped type `any[]`. * @see _.uniq **/ uniq(iterator?: _.ListIterator, context?: any): _Chain; /** * @see _.uniq **/ unique(isSorted?: boolean, iterator?: _.ListIterator): _Chain; /** * @see _.uniq **/ unique(iterator?: _.ListIterator, context?: any): _Chain; /** * Wrapped type `any[][]`. * @see _.zip **/ zip(...arrays: any[][]): _Chain; /** * Wrapped type `any[][]`. * @see _.object **/ object(...keyValuePairs: any[][]): _Chain; /** * @see _.object **/ object(values?: any): _Chain; /** * Wrapped type `any[]`. * @see _.indexOf **/ indexOf(value: T, isSorted?: boolean): _Chain; /** * @see _.indexOf **/ indexOf(value: T, startFrom: number): _Chain; /** * Wrapped type `any[]`. * @see _.lastIndexOf **/ lastIndexOf(value: T, from?: number): _Chain; /** * Wrapped type `any[]`. * @see _.sortedIndex **/ sortedIndex(value: T, iterator?: (x: T) => any, context?: any): _Chain; /** * Wrapped type `number`. * @see _.range **/ range(stop: number, step?: number): _Chain; /** * Wrapped type `number`. * @see _.range **/ range(): _Chain; /* *********** * Functions * ************ */ /** * Wrapped type `Function`. * @see _.bind **/ bind(object: any, ...arguments: any[]): _Chain; /** * Wrapped type `object`. * @see _.bindAll **/ bindAll(...methodNames: string[]): _Chain; /** * Wrapped type `Function`. * @see _.partial **/ partial(...arguments: any[]): _Chain; /** * Wrapped type `Function`. * @see _.memoize **/ memoize(hashFn?: (n: any) => string): _Chain; /** * Wrapped type `Function`. * @see _.defer **/ defer(...arguments: any[]): _Chain; /** * Wrapped type `Function`. * @see _.delay **/ delay(wait: number, ...arguments: any[]): _Chain; /** * @see _.delay **/ delay(...arguments: any[]): _Chain; /** * Wrapped type `Function`. * @see _.throttle **/ throttle(wait: number, options?: _.ThrottleSettings): _Chain; /** * Wrapped type `Function`. * @see _.debounce **/ debounce(wait: number, immediate?: boolean): _Chain; /** * Wrapped type `Function`. * @see _.once **/ once(): _Chain; /** * Wrapped type `number`. * @see _.after **/ after(func: Function): _Chain; /** * Wrapped type `Function`. * @see _.wrap **/ wrap(wrapper: Function): () => _Chain; /** * Wrapped type `Function[]`. * @see _.compose **/ compose(...functions: Function[]): _Chain; /********* * * Objects * ********** */ /** * Wrapped type `object`. * @see _.keys **/ keys(): _Chain; /** * Wrapped type `object`. * @see _.values **/ values(): _Chain; /** * Wrapped type `object`. * @see _.pairs **/ pairs(): _Chain; /** * Wrapped type `object`. * @see _.invert **/ invert(): _Chain; /** * Wrapped type `object`. * @see _.functions **/ functions(): _Chain; /** * @see _.functions **/ methods(): _Chain; /** * Wrapped type `object`. * @see _.extend **/ extend(...sources: any[]): _Chain; /** * Wrapped type `object`. * @see _.pick **/ pick(...keys: string[]): _Chain; /** * Wrapped type `object`. * @see _.omit **/ omit(...keys: string[]): _Chain; /** * Wrapped type `object`. * @see _.defaults **/ defaults(...defaults: any[]): _Chain; /** * Wrapped type `any[]`. * @see _.clone **/ clone(): _Chain; /** * Wrapped type `object`. * @see _.tap **/ tap(interceptor: (...as: any[]) => any): _Chain; /** * Wrapped type `object`. * @see _.has **/ has(key: string): _Chain; /** * Wrapped type `any[]`. * @see _.matches **/ matches(): _Chain; /** * Wrapped type `string`. * @see _.property **/ property(): _Chain; /** * Wrapped type `object`. * @see _.isEqual **/ isEqual(other: any): _Chain; /** * Wrapped type `object`. * @see _.isEmpty **/ isEmpty(): _Chain; /** * Wrapped type `object`. * @see _.isElement **/ isElement(): _Chain; /** * Wrapped type `object`. * @see _.isArray **/ isArray(): _Chain; /** * Wrapped type `object`. * @see _.isObject **/ isObject(): _Chain; /** * Wrapped type `object`. * @see _.isArguments **/ isArguments(): _Chain; /** * Wrapped type `object`. * @see _.isFunction **/ isFunction(): _Chain; /** * Wrapped type `object`. * @see _.isString **/ isString(): _Chain; /** * Wrapped type `object`. * @see _.isNumber **/ isNumber(): _Chain; /** * Wrapped type `object`. * @see _.isFinite **/ isFinite(): _Chain; /** * Wrapped type `object`. * @see _.isBoolean **/ isBoolean(): _Chain; /** * Wrapped type `object`. * @see _.isDate **/ isDate(): _Chain; /** * Wrapped type `object`. * @see _.isRegExp **/ isRegExp(): _Chain; /** * Wrapped type `object`. * @see _.isNaN **/ isNaN(): _Chain; /** * Wrapped type `object`. * @see _.isNull **/ isNull(): _Chain; /** * Wrapped type `object`. * @see _.isUndefined **/ isUndefined(): _Chain; /********* * * Utility * ********** */ /** * Wrapped type `any`. * @see _.identity **/ identity(): _Chain; /** * Wrapped type `any`. * @see _.constant **/ constant(): _Chain; /** * Wrapped type `number`. * @see _.times **/ times(iterator: (n: number) => TResult, context?: any): _Chain; /** * Wrapped type `number`. * @see _.random **/ random(): _Chain; /** * Wrapped type `number`. * @see _.random **/ random(max: number): _Chain; /** * Wrapped type `object`. * @see _.mixin **/ mixin(): _Chain; /** * Wrapped type `string`. * @see _.uniqueId **/ uniqueId(): _Chain; /** * Wrapped type `string`. * @see _.escape **/ escape(): _Chain; /** * Wrapped type `string`. * @see _.unescape **/ unescape(): _Chain; /** * Wrapped type `object`. * @see _.result **/ result(property: string): _Chain; /** * Wrapped type `string`. * @see _.template **/ template(data?: any, settings?: _.TemplateSettings): (...data: any[]) => _Chain; /********** * * Chaining * *********** */ /** * Wrapped type `any`. * @see _.chain **/ chain(): _Chain; /** * Wrapped type `any`. * @see _.value **/ value(): T[]; } interface _ChainSingle { value(): T; } interface _ChainOfArrays extends _Chain { flatten(): _Chain; } declare var _: UnderscoreStatic; declare module "underscore" { export = _; }