diff --git a/Definitions/underscore.d.ts b/Definitions/underscore.d.ts index 6f5779f461..78de45335f 100644 --- a/Definitions/underscore.d.ts +++ b/Definitions/underscore.d.ts @@ -1,9 +1,8 @@ // Type definitions for Underscore 1.4.1 // https://github.com/borisyankov/DefinitelyTyped -interface KeyValuePair { - key: string; - value: any; +interface UnderscoreWrappedObject { + value () : any; } interface TemplateSettings { @@ -12,40 +11,59 @@ interface TemplateSettings { escape?: RegExp; } +interface ListIterator { + (value, key, list?): void; +} + +interface ObjectIterator { + (element, index, list?): void; +} + interface UnderscoreStatic { /**** Collections *****/ - each(list: any[], iterator: any, context?: any): any[]; // interface Iterator = (element, index, list) => any; - each(obj: any, iterator: any, context?: any): any[]; // (value, key, list) - forEach(list: any[], iterator: any, context?: any): any[]; - forEach(obj: any, iterator: any, context?: any): any[]; + each(list: any[], iterator: ListIterator, context?: any): any[]; + each(object: any, iterator: ObjectIterator, context?: any): any[]; + forEach(list: any[], iterator: ObjectIterator, context?: any): any[]; + forEach(object: any, iterator: ListIterator, context?: any): any[]; - map(list: any[], iterator: any, context?: any): any[]; - map(obj: any, iterator: any, context?: any): any[]; - collect(list: any[], iterator: any, context?: any): any[]; - collect(obj: any, iterator: any, context?: any): any[]; + map(list: any[], iterator: ListIterator, context?: any): any[]; + map(object: any, iterator: ObjectIterator, context?: any): any[]; + collect(list: any[], iterator: ListIterator, context?: any): any[]; + collect(object: any, iterator: ObjectIterator, context?: any): any[]; - reduce(list: any[], iterator: any, memo: any, context?: any): any[]; + reduce(list: any[], iterator: any, memo: any, context?: any): any[]; // TODO iterator inject(list: any[], iterator: any, memo: any, context?: any): any[]; foldl(list: any[], iterator: any, memo: any, context?: any): any[]; reduceRight(list: any[], iterator: any, memo: any, context?: any): any[]; foldr(list: any[], iterator: any, memo: any, context?: any): any[]; + find(list: any[], iterator: any, context?: any): any; detect(list: any[], iterator: any, context?: any): any; + filter(list: any[], iterator: any, context?: any): any[]; select(list: any[], iterator: any, context?: any): any[]; + where(list: any[], properties: any): any[]; + reject(list: any[], iterator: any, context?: any): any[]; + all(list: any[], iterator: any, context?: any): bool; - _any(list: any[], iterator?: any, context?: any): bool; + every(list: any[], iterator: any, context?: any): bool; + + any(list: any[], iterator?: any, context?: any): bool; + some(list: any[], iterator?: any, context?: any): bool; + contains(list: any, value: any): bool; contains(list: any[], value: any): bool; + include(list: any, value: any): bool; + include(list: any[], value: any): bool; invoke(list: any[], methodName: string, arguments: any[]): any; - invoke(obj: any, methodName: string, ...arguments: any[]): any; + invoke(object: any, methodName: string, ...arguments: any[]): any; pluck(list: any[], propertyName: string): string[]; max(list: any[], iterator?: any, context?: any): any; @@ -63,18 +81,25 @@ interface UnderscoreStatic { first(array: any[], n?: number): any; head(array: any[], n?: number): any; take(array: any[], n?: number): any; + initial(array: any[], n?: number): any[]; + last(array: any[], n?: number): any; + rest(array: any[], n?: number): any[]; tail(array: any[], n?: number): any[]; drop(array: any[], n?: number): any[]; + compact(array: any[]): any[]; flatten(array: any[], shallow?: bool): any[]; without(array: any[], ...values: any[]): any[]; - union(...arrays: any[]): any[]; - intersection(...arrays: any[]): any[]; - difference(array: any[], ...others: any[]): any[]; + union(...arrays: any[][]): any[]; + intersection(...arrays: any[][]): any[]; + difference(array: any[], ...others: any[][]): any[]; + uniq(array: any[], isSorted?: bool, iterator?: any): any[]; + unique(array: any[], isSorted?: bool, iterator?: any): any[]; + zip(...arrays: any[]): any[]; object(list: any[], values: any[]): any; indexOf(array: any[], value: any, isSorted?: bool): number; @@ -86,8 +111,8 @@ interface UnderscoreStatic { /**** Functions *****/ - bind(func: any, context: any, ...arguments: any[]): () => any; - bindAll(obj: any, ...methodNames: string[]): any; + bind(func: (...as : any[]) => any, context: any, ...arguments: any[]): () => any; + bindAll(object: any, ...methodNames: string[]): any; memoize(func: any, hashFunction?: any): any; defer(func: () => any); delay(func: any, wait: number, ...arguments: any[]): any; @@ -96,7 +121,7 @@ interface UnderscoreStatic { debounce(func: any, wait: number, immediate?: bool): any; once(func: any): any; after(count: number, func: any): any; - wrap(func: any, wrapper: any): () => any; + wrap(func: (...as : any[]) => any, wrapper: any): () => any; compose(...functions: any[]): any; /**** @@ -104,17 +129,18 @@ interface UnderscoreStatic { *****/ keys(object: any): any[]; values(object: any): any[]; - pairs(object: any): KeyValuePair[]; - invert(object: any): any[]; + pairs(object: any): any[]; + invert(object: any): any; + functions(object: any): string[]; methods(object: any): string[]; - extend(destination: any, sources: any): any; + + extend(destination: any, ...sources: any[]): any; pick(object: any, ...keys: string[]): any; - omit(object: any, key: string): any; - omit(object: any, keys: string[]): any; - defaults(object: any, defaults: any): any; + omit(object: any, ...keys: string[]): any; + defaults(object: any, ...defaults: any[]): any; clone(object: any): any; - tap(object: any, interceptor: any): any; + tap(object: any, interceptor: (...as : any[]) => any): any; has(object: any, key: string): bool; isEqual(object: any, other: any): bool; isEmpty(object: any): bool; @@ -136,23 +162,22 @@ interface UnderscoreStatic { /**** Utility *****/ - noConflict(): UnderscoreStatic; + noConflict(): any; identity(value: any): any; - times(n: number, iterator: any, context?: any): any[]; + times(n: number, iterator: (index : number) => void, context?: any): void; random(min: number, max: number): number; - mixin(object: any): any; + mixin(object: any): void; uniqueId(prefix: string): string; uniqueId(): number; - escape(string: string): string; - result(object: any, property: any): any; + escape(str: string): string; + result(object: any, property: string): any; templateSettings: TemplateSettings; - template(templateString: string, data?: any, settings?: any): (data: any) => string; + template(templateString: string, data?: any, settings?: any): (...data: any[]) => string; /**** Chaining *****/ - chain(obj: any): any; - // (obj).value() + chain(object: any): UnderscoreWrappedObject; } declare var _: UnderscoreStatic; \ No newline at end of file diff --git a/Tests/underscore.ts b/Tests/underscore.ts index 895307b984..56fa2f11fb 100644 --- a/Tests/underscore.ts +++ b/Tests/underscore.ts @@ -1,249 +1,240 @@ /// -declare var $: any; +declare var $; -function alert(thing: any) { - $('#content').append('
' + thing + '
'); -} +_.each([1, 2, 3], (num) => alert(num)); +_.each({ one: 1, two: 2, three: 3 }, (num, key) => alert(num)); -$(() => { +_.map([1, 2, 3], (num) => num * 3); +_.map({ one: 1, two: 2, three: 3 }, (num, key) => num * 3); - _.each([1, 2, 3], (num) => alert(num)); - _.each({ one: 1, two: 2, three: 3 }, (num, key) => alert(num)); +var sum = _.reduce([1, 2, 3], (memo, num) => memo + num, 0); - _.map([1, 2, 3], (num) => num * 3); - _.map({ one: 1, two: 2, three: 3 }, (num, key) => num * 3); +var list = [[0, 1], [2, 3], [4, 5]]; +var flat = _.reduceRight(list, (a, b) => a.concat(b), []); - var sum = _.reduce([1, 2, 3], (memo, num) => memo + num, 0); - // alert(sum); +var even = _.find([1, 2, 3, 4, 5, 6], (num) => num % 2 == 0); - var list = [[0, 1], [2, 3], [4, 5]]; - var flat = _.reduceRight(list, (a, b) => a.concat(b), []); - // alert(flat); +var evens = _.filter([1, 2, 3, 4, 5, 6], (num) => num % 2 == 0); - var even = _.find([1, 2, 3, 4, 5, 6], (num) => num % 2 == 0); +var listOfPlays = [{ title: "Cymbeline", author: "Shakespeare", year: 1611 }, { title: "The Tempest", author: "Shakespeare", year: 1611 }, { title: "Other", author: "Not Shakespeare", year: 2012 }]; +_.where(listOfPlays, { author: "Shakespeare", year: 1611 }); - var evens = _.filter([1, 2, 3, 4, 5, 6], (num) => num % 2 == 0); +var odds = _.reject([1, 2, 3, 4, 5, 6], (num) => num % 2 == 0); - var listOfPlays = [{ title: "Cymbeline", author: "Shakespeare", year: 1611 }, { title: "The Tempest", author: "Shakespeare", year: 1611 }, { title: "Other", author: "Not Shakespeare", year: 2012 }]; - _.where(listOfPlays, { author: "Shakespeare", year: 1611 }); +_.all([true, 1, null, 'yes'], _.identity); - var odds = _.reject([1, 2, 3, 4, 5, 6], (num) => num % 2 == 0); +_.any([null, 0, 'yes', false]); - _.all([true, 1, null, 'yes'], _.identity); +_.contains([1, 2, 3], 3); - _._any([null, 0, 'yes', false]); +_.invoke([[5, 1, 7], [3, 2, 1]], 'sort'); - _.contains([1, 2, 3], 3); +var stooges = [{ name: 'moe', age: 40 }, { name: 'larry', age: 50 }, { name: 'curly', age: 60 }]; +_.pluck(stooges, 'name'); - _.invoke([[5, 1, 7], [3, 2, 1]], 'sort'); +_.max(stooges, (stooge) => stooge.age); - var stooges = [{ name: 'moe', age: 40 }, { name: 'larry', age: 50 }, { name: 'curly', age: 60 }]; - _.pluck(stooges, 'name'); +var numbers = [10, 5, 100, 2, 1000]; +_.min(numbers); - var stooges = [{ name: 'moe', age: 40 }, { name: 'larry', age: 50 }, { name: 'curly', age: 60 }]; - _.max(stooges, (stooge) => stooge.age); +_.sortBy([1, 2, 3, 4, 5, 6], (num) => Math.sin(num)); - var numbers = [10, 5, 100, 2, 1000]; - _.min(numbers); +_.groupBy([1.3, 2.1, 2.4], (num) => Math.floor(num)); +_.groupBy(['one', 'two', 'three'], 'length'); - _.sortBy([1, 2, 3, 4, 5, 6], (num) => Math.sin(num)); +_.countBy([1, 2, 3, 4, 5], (num) => num % 2 == 0 ? 'even' : 'odd'); - _.groupBy([1.3, 2.1, 2.4], (num) => Math.floor(num)); - _.groupBy(['one', 'two', 'three'], 'length'); +_.shuffle([1, 2, 3, 4, 5, 6]); - _.countBy([1, 2, 3, 4, 5], (num) => num % 2 == 0 ? 'even' : 'odd'); +// (function(){ return _.toArray(arguments).slice(1); })(1, 2, 3, 4); - _.shuffle([1, 2, 3, 4, 5, 6]); +_.size({ one: 1, two: 2, three: 3 }); - //(function(){ return _.toArray(arguments).slice(1); })(1, 2, 3, 4); +/////////////////////////////////////////////////////////////////////////////////////// - _.size({ one: 1, two: 2, three: 3 }); +_.first([5, 4, 3, 2, 1]); +_.initial([5, 4, 3, 2, 1]); +_.last([5, 4, 3, 2, 1]); +_.rest([5, 4, 3, 2, 1]); +_.compact([0, 1, false, 2, '', 3]); +_.flatten([1, [2], [3, [[4]]]]); +_.flatten([1, [2], [3, [[4]]]], true); +_.without([1, 2, 1, 0, 3, 1, 4], 0, 1); +_.union([1, 2, 3], [101, 2, 1, 10], [2, 1]); +_.intersection([1, 2, 3], [101, 2, 1, 10], [2, 1]); +_.difference([1, 2, 3, 4, 5], [5, 2, 10]); +_.uniq([1, 2, 1, 3, 1, 4]); +_.zip(['moe', 'larry', 'curly'], [30, 40, 50], [true, false, false]); +_.object(['moe', 'larry', 'curly'], [30, 40, 50]); + _.object([['moe', 30], ['larry', 40], ['curly', 50]]); +_.indexOf([1, 2, 3], 2); +_.lastIndexOf([1, 2, 3, 1, 2, 3], 2); +_.sortedIndex([10, 20, 30, 40, 50], 35); +_.range(10); +_.range(1, 11); +_.range(0, 30, 5); +_.range(0, 30, 5); +_.range(0); - /////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////// - _.first([5, 4, 3, 2, 1]); - _.initial([5, 4, 3, 2, 1]); - _.last([5, 4, 3, 2, 1]); - _.rest([5, 4, 3, 2, 1]); - _.compact([0, 1, false, 2, '', 3]); - //_.flatten([1, [2], [3, [[4]]]]); - //_.flatten([1, [2], [3, [[4]]]], true); - _.without([1, 2, 1, 0, 3, 1, 4], 0, 1); - _.union([1, 2, 3], [101, 2, 1, 10], [2, 1]); - _.intersection([1, 2, 3], [101, 2, 1, 10], [2, 1]); - _.difference([1, 2, 3, 4, 5], [5, 2, 10]); - _.uniq([1, 2, 1, 3, 1, 4]); - _.zip(['moe', 'larry', 'curly'], [30, 40, 50], [true, false, false]); - _.object(['moe', 'larry', 'curly'], [30, 40, 50]); - // _.object([['moe', 30], ['larry', 40], ['curly', 50]]); - _.indexOf([1, 2, 3], 2); - _.lastIndexOf([1, 2, 3, 1, 2, 3], 2); - _.sortedIndex([10, 20, 30, 40, 50], 35); - _.range(10); - _.range(1, 11); - _.range(0, 30, 5); - _.range(0, 30, 5); - _.range(0); +var func = function (greeting) { return greeting + ': ' + this.name }; +func = _.bind(func, { name: 'moe' }, 'hi'); +func(); - /////////////////////////////////////////////////////////////////////////////////////// +var buttonView = { + label: 'underscore', + onClick: function () { alert('clicked: ' + this.label); }, + onHover: function () { console.log('hovering: ' + this.label); } +}; +_.bindAll(buttonView); +$('#underscore_button').bind('click', buttonView.onClick); - var func = function (greeting) { return greeting + ': ' + this.name }; - func = _.bind(func, { name: 'moe' }, 'hi'); - // func(); - - var buttonView = { - label: 'underscore', - onClick: function () { alert('clicked: ' + this.label); }, - onHover: function () { console.log('hovering: ' + this.label); } - }; - _.bindAll(buttonView); - //$('#underscore_button').bind('click', buttonView.onClick); - - var fibonacci = _.memoize(function (n) { - return n < 2 ? n : fibonacci(n - 1) + fibonacci(n - 2); - }); - - var log = _.bind(console.log, console); - _.delay(log, 1000, 'logged later'); - - _.defer(function () { alert('deferred'); }); - - var updatePosition = () => alert('updating position...'); - var throttled = _.throttle(updatePosition, 100); - $(window).scroll(throttled); - - var calculateLayout = () => alert('calculating layout...'); - var lazyLayout = _.debounce(calculateLayout, 300); - $(window).resize(lazyLayout); - - var createApplication = () => alert('creating application...'); - var initialize = _.once(createApplication); - initialize(); - initialize(); - - var notes: any[]; - var render = () => alert("rendering..."); - var renderNotes = _.after(notes.length, render); - _.each(notes, (note) => note.asyncSave({ success: renderNotes })); - - var hello = function (name) { return "hello: " + name; }; - hello = _.wrap(hello, (func) => { return "before, " + func("moe") + ", after"; }); - // hello(); - - var greet = function (name) { return "hi: " + name; }; - var exclaim = function (statement) { return statement + "!"; }; - var welcome = _.compose(exclaim, greet); - welcome('moe'); - - /////////////////////////////////////////////////////////////////////////////////////// - - _.keys({ one: 1, two: 2, three: 3 }); - _.values({ one: 1, two: 2, three: 3 }); - _.pairs({ one: 1, two: 2, three: 3 }); - _.invert({ Moe: "Moses", Larry: "Louis", Curly: "Jerome" }); - _.functions(_); - _.extend({ name: 'moe' }, { age: 50 }); - _.pick({ name: 'moe', age: 50, userid: 'moe1' }, 'name', 'age'); - _.omit({ name: 'moe', age: 50, userid: 'moe1' }, 'userid'); - - var iceCream = { flavor: "chocolate" }; - _.defaults(iceCream, { flavor: "vanilla", sprinkles: "lots" }); - - _.clone({ name: 'moe' }); - - _.chain([1, 2, 3, 200]) - .filter(function (num) { return num % 2 == 0; }) - .tap(alert) - .map(function (num) { return num * num }) - .value(); - - _.has({ a: 1, b: 2, c: 3 }, "b"); - - var moe = { name: 'moe', luckyNumbers: [13, 27, 34] }; - var clone = { name: 'moe', luckyNumbers: [13, 27, 34] }; - moe == clone; - _.isEqual(moe, clone); - - _.isEmpty([1, 2, 3]); - _.isEmpty({}); - - _.isElement($('body')[0]); - - (function () { return _.isArray(arguments); })(); - _.isArray([1, 2, 3]); - - _.isObject({}); - _.isObject(1); - - - // (() => { return _.isArguments(arguments); })(1, 2, 3); - _.isArguments([1, 2, 3]); - - _.isFunction(alert); - - _.isString("moe"); - - _.isNumber(8.4 * 5); - - _.isFinite(-101); - - _.isFinite(-Infinity); - - _.isBoolean(null); - - _.isDate(new Date()); - - _.isRegExp(/moe/); - - _.isNaN(NaN); - isNaN(undefined); - _.isNaN(undefined); - - _.isNull(null); - _.isNull(undefined); - - // _.isUndefined(window.missingVariable); - - /////////////////////////////////////////////////////////////////////////////////////// - - var underscore = _.noConflict(); - - var moe2 = { name: 'moe' }; - moe2 === _.identity(moe); - - // _(3).times(function(n){ genie.grantWishNumber(n); }); - - _.random(0, 100); - - _.mixin({ - capitalize: function (string) { - return string.charAt(0).toUpperCase() + string.substring(1).toLowerCase(); - } - }); - // _("fabio").capitalize(); - - _.uniqueId('contact_'); - - _.escape('Curly, Larry & Moe'); - - var object = { cheese: 'crumpets', stuff: function () { return 'nonsense'; } }; - _.result(object, 'cheese'); - - _.result(object, 'stuff'); - - var compiled = _.template("hello: <%= name %>"); - compiled({ name: 'moe' }); - var list2 = "<% _.each(people, function(name) { %>
  • <%= name %>
  • <% }); %>"; - _.template(list2, { people: ['moe', 'curly', 'larry'] }); - var template = _.template("<%- value %>"); - template({ value: '