diff --git a/d3-array/d3-array-tests.ts b/d3-array/d3-array-tests.ts index 3ec1a8fcfd..7183320b71 100644 --- a/d3-array/d3-array-tests.ts +++ b/d3-array/d3-array-tests.ts @@ -6,7 +6,7 @@ * are not intended as functional tests. */ -import * as d3 from 'd3-array'; +import * as d3Array from 'd3-array'; import { scaleTime } from 'd3-scale'; import { timeYear } from 'd3-time'; @@ -47,8 +47,8 @@ let date: Date; let extentNum: [number, number]; let extentStr: [string, string]; let extentNumeric: [NumCoercible, NumCoercible]; -let extentDateMixed: [d3.Primitive, d3.Primitive]; -let extentMixed: [d3.Primitive | NumCoercible, d3.Primitive | NumCoercible]; +let extentDateMixed: [d3Array.Primitive, d3Array.Primitive]; +let extentMixed: [d3Array.Primitive | NumCoercible, d3Array.Primitive | NumCoercible]; let extentDate: [Date, Date]; let numbersArray = [10, 20, 30, 40, 50]; @@ -72,35 +72,35 @@ let mixedObjectArray = [ // without accessors -num = d3.max(numbersArray); -str = d3.max(stringyNumbersArray); -numeric = d3.max(numericArray); -date = d3.max(dateArray); +num = d3Array.max(numbersArray); +str = d3Array.max(stringyNumbersArray); +numeric = d3Array.max(numericArray); +date = d3Array.max(dateArray); // with accessors -num = d3.max(mixedObjectArray, function (datum, index, array) { +num = d3Array.max(mixedObjectArray, function (datum, index, array) { let d: MixedObject = datum; let i: number = index; let arr: Array = array; return datum.num; }); -str = d3.max(mixedObjectArray, function (datum, index, array) { +str = d3Array.max(mixedObjectArray, function (datum, index, array) { let d: MixedObject = datum; let i: number = index; let arr: Array = array; return datum.str; }); -numeric = d3.max(mixedObjectArray, function (datum, index, array) { +numeric = d3Array.max(mixedObjectArray, function (datum, index, array) { let d: MixedObject = datum; let i: number = index; let arr: Array = array; return datum.numeric; }); -date = d3.max(mixedObjectArray, function (datum, index, array) { +date = d3Array.max(mixedObjectArray, function (datum, index, array) { let d: MixedObject = datum; let i: number = index; let arr: Array = array; @@ -111,35 +111,35 @@ date = d3.max(mixedObjectArray, function (datum, index, array) { // without accessors -num = d3.min(numbersArray); -str = d3.min(stringyNumbersArray); -numeric = d3.min(numericArray); -date = d3.min(dateArray); +num = d3Array.min(numbersArray); +str = d3Array.min(stringyNumbersArray); +numeric = d3Array.min(numericArray); +date = d3Array.min(dateArray); // with accessors -num = d3.min(mixedObjectArray, function (datum, index, array) { +num = d3Array.min(mixedObjectArray, function (datum, index, array) { let d: MixedObject = datum; let i: number = index; let arr: Array = array; return datum.num; }); -str = d3.min(mixedObjectArray, function (datum, index, array) { +str = d3Array.min(mixedObjectArray, function (datum, index, array) { let d: MixedObject = datum; let i: number = index; let arr: Array = array; return datum.str; }); -numeric = d3.min(mixedObjectArray, function (datum, index, array) { +numeric = d3Array.min(mixedObjectArray, function (datum, index, array) { let d: MixedObject = datum; let i: number = index; let arr: Array = array; return datum.numeric; }); -date = d3.min(mixedObjectArray, function (datum, index, array) { +date = d3Array.min(mixedObjectArray, function (datum, index, array) { let d: MixedObject = datum; let i: number = index; let arr: Array = array; @@ -150,36 +150,36 @@ date = d3.min(mixedObjectArray, function (datum, index, array) { // without accessors -extentNum = d3.extent(numbersArray); -extentStr = d3.extent(stringyNumbersArray); -extentNumeric = d3.extent(numericArray); -extentDate = d3.extent(dateArray); -extentMixed = d3.extent([new NumCoercible(10), 13, '12', true]); +extentNum = d3Array.extent(numbersArray); +extentStr = d3Array.extent(stringyNumbersArray); +extentNumeric = d3Array.extent(numericArray); +extentDate = d3Array.extent(dateArray); +extentMixed = d3Array.extent([new NumCoercible(10), 13, '12', true]); // with accessors -extentNum = d3.extent(mixedObjectArray, function (datum, index, array) { +extentNum = d3Array.extent(mixedObjectArray, function (datum, index, array) { let d: MixedObject = datum; let i: number = index; let arr: Array = array; return datum.num; }); -extentStr = d3.extent(mixedObjectArray, function (datum, index, array) { +extentStr = d3Array.extent(mixedObjectArray, function (datum, index, array) { let d: MixedObject = datum; let i: number = index; let arr: Array = array; return datum.str; }); -extentMixed = d3.extent(mixedObjectArray, function (datum, index, array) { +extentMixed = d3Array.extent(mixedObjectArray, function (datum, index, array) { let d: MixedObject = datum; let i: number = index; let arr: Array = array; return datum.numeric; }); -extentDateMixed = d3.extent(mixedObjectArray, function (datum, index, array) { +extentDateMixed = d3Array.extent(mixedObjectArray, function (datum, index, array) { let d: MixedObject = datum; let i: number = index; let arr: Array = array; @@ -188,9 +188,9 @@ extentDateMixed = d3.extent(mixedObjectArray, function (datum, index, array) { // mean() ---------------------------------------------------------------------- -num = d3.mean(numbersArray); +num = d3Array.mean(numbersArray); -num = d3.mean(mixedObjectArray, function (datum, index, array) { +num = d3Array.mean(mixedObjectArray, function (datum, index, array) { let d: MixedObject = datum; let i: number = index; let arr: Array = array; @@ -199,9 +199,9 @@ num = d3.mean(mixedObjectArray, function (datum, index, array) { // median() -------------------------------------------------------------------- -num = d3.median(numbersArray); +num = d3Array.median(numbersArray); -num = d3.median(mixedObjectArray, function (datum, index, array) { +num = d3Array.median(mixedObjectArray, function (datum, index, array) { let d: MixedObject = datum; let i: number = index; let arr: Array = array; @@ -210,9 +210,9 @@ num = d3.median(mixedObjectArray, function (datum, index, array) { // quantile() ------------------------------------------------------------------ -num = d3.quantile(numbersArray, 0.5); +num = d3Array.quantile(numbersArray, 0.5); -num = d3.quantile(mixedObjectArray, 0.5, function (datum, index, array) { +num = d3Array.quantile(mixedObjectArray, 0.5, function (datum, index, array) { let d: MixedObject = datum; let i: number = index; let arr: Array = array; @@ -222,9 +222,9 @@ num = d3.quantile(mixedObjectArray, 0.5, function (datum, index, array) { // sum() ----------------------------------------------------------------------- -num = d3.sum(numbersArray); +num = d3Array.sum(numbersArray); -num = d3.sum(mixedObjectArray, function (datum, index, array) { +num = d3Array.sum(mixedObjectArray, function (datum, index, array) { let d: MixedObject = datum; let i: number = index; let arr: Array = array; @@ -233,9 +233,9 @@ num = d3.sum(mixedObjectArray, function (datum, index, array) { // deviation() ----------------------------------------------------------------- -num = d3.deviation(numbersArray); +num = d3Array.deviation(numbersArray); -num = d3.deviation(mixedObjectArray, function (datum, index, array) { +num = d3Array.deviation(mixedObjectArray, function (datum, index, array) { let d: MixedObject = datum; let i: number = index; let arr: Array = array; @@ -244,9 +244,9 @@ num = d3.deviation(mixedObjectArray, function (datum, index, array) { // variance() ------------------------------------------------------------------ -num = d3.variance(numbersArray); +num = d3Array.variance(numbersArray); -num = d3.variance(mixedObjectArray, function (datum, index, array) { +num = d3Array.variance(mixedObjectArray, function (datum, index, array) { let d: MixedObject = datum; let i: number = index; let arr: Array = array; @@ -259,65 +259,65 @@ num = d3.variance(mixedObjectArray, function (datum, index, array) { // scan() ---------------------------------------------------------------------- -num = d3.scan(mixedObjectArray, function (a, b) { +num = d3Array.scan(mixedObjectArray, function (a, b) { return a.num - b.num; // a and b are of type MixedObject }); // bisectLeft() ---------------------------------------------------------------- -num = d3.bisectLeft([0, 2, 3, 4, 7, 8], 4); -num = d3.bisectLeft([0, 2, 3, 4, 7, 8], 4, 1); -num = d3.bisectLeft([0, 2, 3, 4, 7, 8], 4, 1, 4); +num = d3Array.bisectLeft([0, 2, 3, 4, 7, 8], 4); +num = d3Array.bisectLeft([0, 2, 3, 4, 7, 8], 4, 1); +num = d3Array.bisectLeft([0, 2, 3, 4, 7, 8], 4, 1, 4); -num = d3.bisectLeft(['0', '2', '3', '4', '7', '8'], '21'); -num = d3.bisectLeft(['0', '2', '3', '4', '7', '8'], '21', 1); -num = d3.bisectLeft(['0', '2', '3', '4', '7', '8'], '21', 1, 4); +num = d3Array.bisectLeft(['0', '2', '3', '4', '7', '8'], '21'); +num = d3Array.bisectLeft(['0', '2', '3', '4', '7', '8'], '21', 1); +num = d3Array.bisectLeft(['0', '2', '3', '4', '7', '8'], '21', 1, 4); -num = d3.bisectLeft([new Date(2010, 1, 1), new Date(2011, 1, 1), new Date(2012, 1, 1), new Date(2013, 1, 1)], new Date(2011, 2, 1)); -num = d3.bisectLeft([new Date(2010, 1, 1), new Date(2011, 1, 1), new Date(2012, 1, 1), new Date(2013, 1, 1)], new Date(2011, 2, 1), 1); -num = d3.bisectLeft([new Date(2010, 1, 1), new Date(2011, 1, 1), new Date(2012, 1, 1), new Date(2013, 1, 1)], new Date(2011, 2, 1), 1, 2); +num = d3Array.bisectLeft([new Date(2010, 1, 1), new Date(2011, 1, 1), new Date(2012, 1, 1), new Date(2013, 1, 1)], new Date(2011, 2, 1)); +num = d3Array.bisectLeft([new Date(2010, 1, 1), new Date(2011, 1, 1), new Date(2012, 1, 1), new Date(2013, 1, 1)], new Date(2011, 2, 1), 1); +num = d3Array.bisectLeft([new Date(2010, 1, 1), new Date(2011, 1, 1), new Date(2012, 1, 1), new Date(2013, 1, 1)], new Date(2011, 2, 1), 1, 2); // bisectRight() --------------------------------------------------------------- -num = d3.bisectRight([0, 2, 3, 4, 7, 8], 4); -num = d3.bisectRight([0, 2, 3, 4, 7, 8], 4, 1); -num = d3.bisectRight([0, 2, 3, 4, 7, 8], 4, 1, 4); +num = d3Array.bisectRight([0, 2, 3, 4, 7, 8], 4); +num = d3Array.bisectRight([0, 2, 3, 4, 7, 8], 4, 1); +num = d3Array.bisectRight([0, 2, 3, 4, 7, 8], 4, 1, 4); -num = d3.bisectRight(['0', '2', '3', '4', '7', '8'], '21'); -num = d3.bisectRight(['0', '2', '3', '4', '7', '8'], '21', 1); -num = d3.bisectRight(['0', '2', '3', '4', '7', '8'], '21', 1, 4); +num = d3Array.bisectRight(['0', '2', '3', '4', '7', '8'], '21'); +num = d3Array.bisectRight(['0', '2', '3', '4', '7', '8'], '21', 1); +num = d3Array.bisectRight(['0', '2', '3', '4', '7', '8'], '21', 1, 4); -num = d3.bisectRight([new Date(2010, 1, 1), new Date(2011, 1, 1), new Date(2012, 1, 1), new Date(2013, 1, 1)], new Date(2011, 2, 1)); -num = d3.bisectRight([new Date(2010, 1, 1), new Date(2011, 1, 1), new Date(2012, 1, 1), new Date(2013, 1, 1)], new Date(2011, 2, 1), 1); -num = d3.bisectRight([new Date(2010, 1, 1), new Date(2011, 1, 1), new Date(2012, 1, 1), new Date(2013, 1, 1)], new Date(2011, 2, 1), 1, 2); +num = d3Array.bisectRight([new Date(2010, 1, 1), new Date(2011, 1, 1), new Date(2012, 1, 1), new Date(2013, 1, 1)], new Date(2011, 2, 1)); +num = d3Array.bisectRight([new Date(2010, 1, 1), new Date(2011, 1, 1), new Date(2012, 1, 1), new Date(2013, 1, 1)], new Date(2011, 2, 1), 1); +num = d3Array.bisectRight([new Date(2010, 1, 1), new Date(2011, 1, 1), new Date(2012, 1, 1), new Date(2013, 1, 1)], new Date(2011, 2, 1), 1, 2); // bisect() -------------------------------------------------------------------- -num = d3.bisect([0, 2, 3, 4, 7, 8], 4); -num = d3.bisect([0, 2, 3, 4, 7, 8], 4, 1); -num = d3.bisect([0, 2, 3, 4, 7, 8], 4, 1, 4); +num = d3Array.bisect([0, 2, 3, 4, 7, 8], 4); +num = d3Array.bisect([0, 2, 3, 4, 7, 8], 4, 1); +num = d3Array.bisect([0, 2, 3, 4, 7, 8], 4, 1, 4); -num = d3.bisect(['0', '2', '3', '4', '7', '8'], '21'); -num = d3.bisect(['0', '2', '3', '4', '7', '8'], '21', 1); -num = d3.bisect(['0', '2', '3', '4', '7', '8'], '21', 1, 4); +num = d3Array.bisect(['0', '2', '3', '4', '7', '8'], '21'); +num = d3Array.bisect(['0', '2', '3', '4', '7', '8'], '21', 1); +num = d3Array.bisect(['0', '2', '3', '4', '7', '8'], '21', 1, 4); -num = d3.bisect([new Date(2010, 1, 1), new Date(2011, 1, 1), new Date(2012, 1, 1), new Date(2013, 1, 1)], new Date(2011, 2, 1)); -num = d3.bisect([new Date(2010, 1, 1), new Date(2011, 1, 1), new Date(2012, 1, 1), new Date(2013, 1, 1)], new Date(2011, 2, 1), 1); -num = d3.bisect([new Date(2010, 1, 1), new Date(2011, 1, 1), new Date(2012, 1, 1), new Date(2013, 1, 1)], new Date(2011, 2, 1), 1, 2); +num = d3Array.bisect([new Date(2010, 1, 1), new Date(2011, 1, 1), new Date(2012, 1, 1), new Date(2013, 1, 1)], new Date(2011, 2, 1)); +num = d3Array.bisect([new Date(2010, 1, 1), new Date(2011, 1, 1), new Date(2012, 1, 1), new Date(2013, 1, 1)], new Date(2011, 2, 1), 1); +num = d3Array.bisect([new Date(2010, 1, 1), new Date(2011, 1, 1), new Date(2012, 1, 1), new Date(2013, 1, 1)], new Date(2011, 2, 1), 1, 2); // bisector() ------------------------------------------------------------------ mixedObjectArray.sort(function (a, b) { return a.date.valueOf() - b.date.valueOf(); }); -let mixedObjectDateBisectorObject: d3.Bisector; +let mixedObjectDateBisectorObject: d3Array.Bisector; // define using accessor -mixedObjectDateBisectorObject = d3.bisector(function (el) { +mixedObjectDateBisectorObject = d3Array.bisector(function (el) { return el.date; }); // define using comparator -mixedObjectDateBisectorObject = d3.bisector(function (el, x) { +mixedObjectDateBisectorObject = d3Array.bisector(function (el, x) { return el.date.valueOf() - x.valueOf(); }); @@ -334,15 +334,15 @@ num = mixedObjectDateBisectorObject.right(mixedObjectArray, new Date(2015, 3, 14 // ascending() ----------------------------------------------------------------- -num = d3.ascending(10, 20); -num = d3.ascending('10', '20'); -num = d3.ascending(new Date(2016, 6, 13), new Date(2016, 6, 14)); +num = d3Array.ascending(10, 20); +num = d3Array.ascending('10', '20'); +num = d3Array.ascending(new Date(2016, 6, 13), new Date(2016, 6, 14)); // descending() ---------------------------------------------------------------- -num = d3.descending(10, 20); -num = d3.descending('10', '20'); -num = d3.descending(new Date(2016, 6, 13), new Date(2016, 6, 14)); +num = d3Array.descending(10, 20); +num = d3Array.descending('10', '20'); +num = d3Array.descending(new Date(2016, 6, 13), new Date(2016, 6, 14)); // ----------------------------------------------------------------------------- // Test Transforming Arrays @@ -367,20 +367,20 @@ let testArrays: MixedObject[][] = [ let mergedArray: MixedObject[]; -mergedArray = d3.merge(testArrays); // inferred type -mergedArray = d3.merge(testArrays); // explicit type +mergedArray = d3Array.merge(testArrays); // inferred type +mergedArray = d3Array.merge(testArrays); // explicit type // mergedArray = d3.merge([[10, 40, 30], [15, 30]]); // fails, type mismatch // pairs() --------------------------------------------------------------------- let pairs: Array<[MixedObject, MixedObject]>; -pairs = d3.pairs(mergedArray); +pairs = d3Array.pairs(mergedArray); // permute() ------------------------------------------------------------------- // getting a permutation of array elements -mergedArray = d3.permute(mergedArray, [1, 0, 2, 5, 3, 4, 6]); +mergedArray = d3Array.permute(mergedArray, [1, 0, 2, 5, 3, 4, 6]); // Getting an ordered array with object properties @@ -391,35 +391,35 @@ let testObject = { more: [10, 30, 40] }; -let x: Array = d3.permute(testObject, ['name', 'val', 'when', 'more']); +let x: Array = d3Array.permute(testObject, ['name', 'val', 'when', 'more']); // range() --------------------------------------------------------------------- -numbersArray = d3.range(10); -numbersArray = d3.range(1, 10); -numbersArray = d3.range(1, 10, 0.5); +numbersArray = d3Array.range(10); +numbersArray = d3Array.range(1, 10); +numbersArray = d3Array.range(1, 10, 0.5); // shuffle() ------------------------------------------------------------------- -mergedArray = d3.shuffle(mergedArray); +mergedArray = d3Array.shuffle(mergedArray); -mergedArray = d3.shuffle(mergedArray, 1); +mergedArray = d3Array.shuffle(mergedArray, 1); -mergedArray = d3.shuffle(mergedArray, 1, 3); +mergedArray = d3Array.shuffle(mergedArray, 1, 3); // ticks() --------------------------------------------------------------------- -numbersArray = d3.ticks(1, 10, 5); +numbersArray = d3Array.ticks(1, 10, 5); // tickStep() ------------------------------------------------------------------ -numbersArray = d3.tickStep(1, 10, 5); +numbersArray = d3Array.tickStep(1, 10, 5); // transpose() ----------------------------------------------------------------- -testArrays = d3.transpose([ +testArrays = d3Array.transpose([ [ new MixedObject(10, new Date(2016, 6, 1)), new MixedObject(50, new Date(2017, 4, 15)) @@ -432,7 +432,7 @@ testArrays = d3.transpose([ // zip() ----------------------------------------------------------------------- -testArrays = d3.zip( +testArrays = d3Array.zip( [ new MixedObject(10, new Date(2016, 6, 1)), new MixedObject(20, new Date(2016, 7, 30)), @@ -454,11 +454,11 @@ let tScale = scaleTime(); // Create histogram generator ================================================== -let defaultHistogram: d3.HistogramGenerator; -defaultHistogram = d3.histogram(); +let defaultHistogram: d3Array.HistogramGenerator; +defaultHistogram = d3Array.histogram(); -let testHistogram: d3.HistogramGenerator; -testHistogram = d3.histogram(); +let testHistogram: d3Array.HistogramGenerator; +testHistogram = d3Array.histogram(); // Configure histogram generator =============================================== @@ -501,7 +501,7 @@ domainAccessorFn = testHistogram.domain(); defaultHistogram = defaultHistogram.thresholds(3); // with threshold count generator -defaultHistogram = defaultHistogram.thresholds(d3.thresholdScott); +defaultHistogram = defaultHistogram.thresholds(d3Array.thresholdScott); // with thresholds value array @@ -518,10 +518,10 @@ testHistogram = testHistogram.thresholds(tScale.ticks(timeYear)); // Use histogram generator ===================================================== -let defaultBins: Array>; +let defaultBins: Array>; defaultBins = defaultHistogram([-1, 0, 1, 1, 3, 20, 234]); -let defaultBin: d3.Bin; +let defaultBin: d3Array.Bin; defaultBin = defaultBins[0]; num = defaultBin.length; // defaultBin is array @@ -529,10 +529,10 @@ num = defaultBin[0]; // with element type number num = defaultBin.x0; // bin lower bound is number num = defaultBin.x1; // bin upper bound is number -let testBins: Array>; +let testBins: Array>; testBins = testHistogram(mixedObjectArray); -let testBin: d3.Bin; +let testBin: d3Array.Bin; testBin = testBins[0]; num = testBin.length; // defaultBin is array @@ -544,8 +544,8 @@ date = testBin.x1; // bin upper bound is Date // Histogram Tresholds ========================================================= -num = d3.thresholdFreedmanDiaconis([-1, 0, 1, 1, 3, 20, 234], -1, 234); +num = d3Array.thresholdFreedmanDiaconis([-1, 0, 1, 1, 3, 20, 234], -1, 234); -num = d3.thresholdScott([-1, 0, 1, 1, 3, 20, 234], -1, 234); +num = d3Array.thresholdScott([-1, 0, 1, 1, 3, 20, 234], -1, 234); -num = d3.thresholdSturges([-1, 0, 1, 1, 3, 20, 234]); +num = d3Array.thresholdSturges([-1, 0, 1, 1, 3, 20, 234]); diff --git a/d3-array/index.d.ts b/d3-array/index.d.ts index 40563fa880..933f59e5a6 100644 --- a/d3-array/index.d.ts +++ b/d3-array/index.d.ts @@ -157,7 +157,7 @@ export function sum(array: T[], accessor: (datum: T, index: number, array: T[ export function deviation(array: number[]): number | undefined; /** - * Compute the standard deviation, defined as the square root of the bias-corrected variance, of the given array, + * Compute the standard deviation, defined as the square root of the bias-corrected variance, of the given array, * using the given accessor to convert values to numbers. */ export function deviation(array: T[], accessor: (datum: T, index: number, array: T[]) => number): number | undefined; @@ -255,7 +255,7 @@ export function range(start: number, stop: number, step?: number): number[]; export function shuffle(array: T[], lo?: number, hi?: number): T[]; /** - * Generate an array of approximately count + 1 uniformly-spaced, nicely-rounded values between start and stop (inclusive). + * Generate an array of approximately count + 1 uniformly-spaced, nicely-rounded values between start and stop (inclusive). */ export function ticks(start: number, stop: number, count: number): number[]; @@ -274,7 +274,7 @@ export function transpose(matrix: T[][]): T[][]; /** * Returns an array of arrays, where the ith array contains the ith element from each of the argument arrays. - * The returned array is truncated in length to the shortest array in arrays. If arrays contains only a single array, the returned array + * The returned array is truncated in length to the shortest array in arrays. If arrays contains only a single array, the returned array * contains one-element arrays. With no arguments, the returned array is empty. */ export function zip(...arrays: T[][]): T[][]; @@ -311,7 +311,7 @@ export interface HistogramGenerator { /** * Divide the domain uniformly into approximately count bins. IMPORTANT: This threshold * setting approach only works, when the materialized values are numbers! - * + * * @param count The desired number of uniform bins. */ thresholds(count: number): this; @@ -319,10 +319,10 @@ export interface HistogramGenerator { * Set a threshold accessor function, which returns the desired number of bins. * Divides the domain uniformly into approximately count bins. IMPORTANT: This threshold * setting approach only works, when the materialized values are numbers! - * + * * @param count A function which accepts as arguments the array of materialized values, and * optionally the domain minimum and maximum. The function calcutates and returns the suggested - * number of bins. + * number of bins. */ thresholds(count: ThresholdCountGenerator): this; /** @@ -332,12 +332,12 @@ export interface HistogramGenerator { */ thresholds(thresholds: Value[]): this; /** - * Set a threshold accessor function, which returns the array of values to be used as + * Set a threshold accessor function, which returns the array of values to be used as * thresholds in determining the bins. - * + * * @param thresholds A function which accepts as arguments the array of materialized values, and - * optionally the domain minimum and maximum. The function calcutates and returns the array of values to be used as - * thresholds in determining the bins. + * optionally the domain minimum and maximum. The function calcutates and returns the array of values to be used as + * thresholds in determining the bins. */ thresholds(thresholds: ThresholdArrayGenerator): this; } @@ -354,4 +354,3 @@ export function thresholdFreedmanDiaconis(values: number[], min: number, max: nu export function thresholdScott(values: number[], min: number, max: number): number; // of type ThresholdCountGenerator export function thresholdSturges(values: number[]): number; // of type ThresholdCountGenerator - diff --git a/d3-axis/d3-axis-tests.ts b/d3-axis/d3-axis-tests.ts index 54fa6479c5..a95c58c8b3 100644 --- a/d3-axis/d3-axis-tests.ts +++ b/d3-axis/d3-axis-tests.ts @@ -13,6 +13,7 @@ import { scaleOrdinal, ScaleOrdinal, scalePow, + ScalePower, scaleTime, ScaleTime, } from 'd3-scale'; @@ -70,11 +71,17 @@ let leftAxis: d3Axis.Axis = d3Axis.axisLeft(scal // scale(...) ---------------------------------------------------------------- leftAxis = leftAxis.scale(scalePow()); +let powerScale: ScalePower = leftAxis.scale>(); +// powerScale = leftAxis.scale(); // fails, without casting as AxisScale is purposely generic + + +bottomAxis = bottomAxis.scale(scaleOrdinal()); // bottomAxis = bottomAxis.scale(scalePow()) // fails, domain of scale incompatible with domain of axis let axisScale: d3Axis.AxisScale = bottomAxis.scale(); -// let ordinalScale: ScaleOrdinal = bottomAxis.scale(); // fails, without casting as AxisScale is purposely generic +let ordinalScale: ScaleOrdinal = bottomAxis.scale>(); +// ordinalScale = bottomAxis.scale(); // fails, without casting as AxisScale is purposely generic // ticks(...) ---------------------------------------------------------------- diff --git a/d3-axis/index.d.ts b/d3-axis/index.d.ts index 33c3b2927f..233dd5f40d 100644 --- a/d3-axis/index.d.ts +++ b/d3-axis/index.d.ts @@ -1,11 +1,10 @@ // Type definitions for D3JS d3-axis module 1.0.0 // Project: https://github.com/d3/d3-axis/ -// Definitions by: Alex Ford , Boris Yankov , Tom Wanzek +// Definitions by: Tom Wanzek , Alex Ford , Boris Yankov // Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped import { Selection, TransitionLike } from 'd3-selection'; - // -------------------------------------------------------------------------- // Shared Types and Interfaces // -------------------------------------------------------------------------- @@ -67,14 +66,14 @@ export interface Axis { /** * Gets the current scale underlying the axis. */ - scale(): AxisScale; + scale>(): A; /** * Sets the scale and returns the axis. * * @param scale The scale to be used for axis generation */ - scale(scale: AxisScale): Axis; + scale(scale: AxisScale): this; /** * Sets the arguments that will be passed to scale.ticks and scale.tickFormat when the axis is rendered, and returns the axis generator. @@ -82,7 +81,7 @@ export interface Axis { * @param count Number of ticks that should be rendered * @param specifier An optional format specifier to customize how the tick values are formatted. */ - ticks(count: number, specifier?: string): Axis; + ticks(count: number, specifier?: string): this; /** * Sets the arguments that will be passed to scale.ticks and scale.tickFormat when the axis is rendered, and returns the axis generator. @@ -92,12 +91,12 @@ export interface Axis { * in d3-time. E.g. as obtained by passing in d3.timeMinute.every(15). * @param specifier An optional format specifier to customize how the tick values are formatted. */ - ticks(interval: AxisTimeInterval, specifier?: string): Axis; + ticks(interval: AxisTimeInterval, specifier?: string): this; /** * Sets the arguments that will be passed to scale.ticks and scale.tickFormat when the axis is rendered, and returns the axis generator. */ - ticks(arg0: any, ...args: any[]): Axis; + ticks(arg0: any, ...args: any[]): this; /** * Get an array containing the currently set arguments to be passed into scale.ticks and scale.tickFormat. @@ -109,7 +108,7 @@ export interface Axis { * * @param args An array containing a single element representing the count, i.e. number of ticks to be rendered. */ - tickArguments(args: [number]): Axis; + tickArguments(args: [number]): this; /** * Sets the arguments that will be passed to scale.ticks and scale.tickFormat when the axis is rendered, and returns the axis generator. @@ -117,7 +116,7 @@ export interface Axis { * @param args An array containing two elements. The first element represents the count, i.e. number of ticks to be rendered. The second * element is a string representing the format specifier to customize how the tick values are formatted. */ - tickArguments(args: [number, string]): Axis; + tickArguments(args: [number, string]): this; /** * Sets the arguments that will be passed to scale.ticks and scale.tickFormat when the axis is rendered, and returns the axis generator. @@ -126,7 +125,7 @@ export interface Axis { * @param args An array containing a single element representing a time interval used to generate date-based ticks. * This is typically a TimeInterval/CountableTimeInterval as defined in d3-time. E.g. as obtained by passing in d3.timeMinute.every(15). */ - tickArguments(args: [AxisTimeInterval]): Axis; + tickArguments(args: [AxisTimeInterval]): this; /** * Sets the arguments that will be passed to scale.ticks and scale.tickFormat when the axis is rendered, and returns the axis generator. @@ -136,14 +135,14 @@ export interface Axis { * This is typically a TimeInterval/CountableTimeInterval as defined in d3-time. E.g. as obtained by passing in d3.timeMinute.every(15). * The second element is a string representing the format specifier to customize how the tick values are formatted. */ - tickArguments(args: [AxisTimeInterval, string]): Axis; + tickArguments(args: [AxisTimeInterval, string]): this; /** * Sets the arguments that will be passed to scale.ticks and scale.tickFormat when the axis is rendered, and returns the axis generator. * * @param args An array with arguments suitable for the scale to be used for tick generation */ - tickArguments(args: any[]): Axis; + tickArguments(args: any[]): this; /** * Returns the current tick values, which defaults to null. @@ -158,14 +157,14 @@ export interface Axis { * * @param values An array with values from the Domain of the scale underlying the axis. */ - tickValues(values: Domain[]): Axis; + tickValues(values: Domain[]): this; /** * Clears any previously-set explicit tick values and reverts back to the scale’s tick generator. * * @param values null */ - tickValues(values: null): Axis; + tickValues(values: null): this; /** @@ -179,7 +178,7 @@ export interface Axis { * @param format A function mapping a value from the axis Domain to a formatted string * for display purposes. */ - tickFormat(format: (domainValue: Domain) => string): Axis; + tickFormat(format: (domainValue: Domain) => string): this; /** * Reset the tick format function. A null format indicates that the scale’s @@ -189,7 +188,7 @@ export interface Axis { * * @param format null */ - tickFormat(format: null): Axis; + tickFormat(format: null): this; /** * Get the current inner tick size, which defaults to 6. @@ -200,7 +199,7 @@ export interface Axis { * * @param size Tick size in pixels (Default is 6). */ - tickSize(size: number): Axis; + tickSize(size: number): this; /** * Get the current inner tick size, which defaults to 6. @@ -216,7 +215,7 @@ export interface Axis { * * @param size Tick size in pixels (Default is 6). */ - tickSizeInner(size: number): Axis; + tickSizeInner(size: number): this; /** * Get the current outer tick size, which defaults to 6. @@ -240,7 +239,7 @@ export interface Axis { * * @param size Tick size in pixels (Default is 6). */ - tickSizeOuter(size: number): Axis; + tickSizeOuter(size: number): this; /** * Get the current padding, which defaults to 3. @@ -252,7 +251,7 @@ export interface Axis { * * @param padding Padding in pixels (Default is 3). */ - tickPadding(padding: number): Axis; + tickPadding(padding: number): this; } diff --git a/d3-brush/index.d.ts b/d3-brush/index.d.ts index a91946b5c9..bfca8da856 100644 --- a/d3-brush/index.d.ts +++ b/d3-brush/index.d.ts @@ -1,9 +1,9 @@ // Type definitions for D3JS d3-brush module 1.0.1 // Project: https://github.com/d3/d3-brush/ -// Definitions by: Alex Ford , Boris Yankov , Tom Wanzek +// Definitions by: Tom Wanzek , Alex Ford , Boris Yankov // Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped -import { ArrayLike, Selection, TransitionLike } from 'd3-selection'; +import { ArrayLike, Selection, TransitionLike, ValueFn } from 'd3-selection'; /** * Type alias for a BrushSelection. For a two-dimensional brush, it must be defined as [[x0, y0], [x1, y1]], @@ -15,20 +15,20 @@ export type BrushSelection = [[number, number], [number, number]] | [number, num export interface BrushBehavior { (group: Selection, ...args: any[]): void; - move(group: Selection, selection: BrushSelection): BrushBehavior; - move(group: Selection, selection: (this: SVGGElement, d?: Datum, i?: number, group?: Array | ArrayLike) => BrushSelection): BrushBehavior; - move(group: TransitionLike, selection: BrushSelection): BrushBehavior; - move(group: TransitionLike, selection: (this: SVGGElement, d?: Datum, i?: number, group?: Array | ArrayLike) => BrushSelection): BrushBehavior; - extent(): (this: SVGGElement, d: Datum, i: number, group: Array | ArrayLike) => [[number, number], [number, number]]; - extent(extent: [[number, number], [number, number]]): BrushBehavior; - extent(extent: (this: SVGGElement, d: Datum, i: number, group: Array | ArrayLike) => [[number, number], [number, number]]): BrushBehavior; - filter(): (this: SVGGElement, datum: Datum, index: number, group: Array | ArrayLike) => boolean; - filter(filterFn: (this: SVGGElement, datum: Datum, index: number, group: Array | ArrayLike) => boolean): BrushBehavior; + move(group: Selection, selection: BrushSelection): void; + move(group: Selection, selection: ValueFn): void; + move(group: TransitionLike, selection: BrushSelection): void; + move(group: TransitionLike, selection: ValueFn): void; + extent(): ValueFn; + extent(extent: [[number, number], [number, number]]): this; + extent(extent: ValueFn): this; + filter(): ValueFn; + filter(filterFn: ValueFn): this; handleSize(): number; - handleSize(size: number): BrushBehavior; - on(typenames: string): (this: SVGGElement, datum: Datum, index: number, group: Array | ArrayLike) => void; - on(typenames: string, callback: null): BrushBehavior; - on(typenames: string, callback: (this: SVGGElement, datum: Datum, index: number, group: Array | ArrayLike) => void): BrushBehavior; + handleSize(size: number): this; + on(typenames: string): ValueFn; + on(typenames: string, callback: null): this; + on(typenames: string, callback: ValueFn): this; } diff --git a/d3-chord/index.d.ts b/d3-chord/index.d.ts index 3c232c15a6..f78cb62b78 100644 --- a/d3-chord/index.d.ts +++ b/d3-chord/index.d.ts @@ -1,6 +1,6 @@ // Type definitions for D3JS d3-chord module 1.0.0 // Project: https://github.com/d3/d3-chord/ -// Definitions by: Alex Ford , Boris Yankov , Tom Wanzek +// Definitions by: Tom Wanzek , Alex Ford , Boris Yankov // Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped // --------------------------------------------------------------------- @@ -34,16 +34,16 @@ export interface Chords extends Array { export interface ChordLayout { (matrix: number[][]): Chords; padAngle(): number; - padAngle(angle: number): ChordLayout; + padAngle(angle: number): this; sortGroups(): ((a: number, b: number) => number) | null; - sortGroups(compare: null): ChordLayout; - sortGroups(compare: (a: number, b: number) => number): ChordLayout; + sortGroups(compare: null): this; + sortGroups(compare: (a: number, b: number) => number): this; sortSubgroups(): ((a: number, b: number) => number) | null; - sortSubgroups(compare: null): ChordLayout; - sortSubgroups(compare: (a: number, b: number) => number): ChordLayout; + sortSubgroups(compare: null): this; + sortSubgroups(compare: (a: number, b: number) => number): this; sortChords(): ((a: number, b: number) => number) | null; - sortChords(compare: null): ChordLayout; - sortChords(compare: (a: number, b: number) => number): ChordLayout; + sortChords(compare: null): this; + sortChords(compare: (a: number, b: number) => number): this; } export function chord(): ChordLayout; @@ -56,21 +56,21 @@ export function chord(): ChordLayout; export interface RibbonGenerator { (this: This, d: ChordDatum, ...args: any[]): string | undefined; source(): (this: This, d: ChordDatum, ...args: any[]) => ChordSubgroupDatum; - source(source: (this: This, d: ChordDatum, ...args: any[]) => ChordSubgroupDatum): RibbonGenerator; + source(source: (this: This, d: ChordDatum, ...args: any[]) => ChordSubgroupDatum): this; target(): (this: This, d: ChordDatum, ...args: any[]) => ChordSubgroupDatum; - target(target: (this: This, d: ChordDatum, ...args: any[]) => ChordSubgroupDatum): RibbonGenerator; + target(target: (this: This, d: ChordDatum, ...args: any[]) => ChordSubgroupDatum): this; radius(): (this: This, d: ChordSubgroupDatum, ...args: any[]) => number; - radius(radius: number): RibbonGenerator; - radius(radius: (this: This, d: ChordSubgroupDatum, ...args: any[]) => number): RibbonGenerator; + radius(radius: number): this; + radius(radius: (this: This, d: ChordSubgroupDatum, ...args: any[]) => number): this; startAngle(): (this: This, d: ChordSubgroupDatum, ...args: any[]) => number; - startAngle(angle: number): RibbonGenerator; - startAngle(angle: (this: This, d: ChordSubgroupDatum, ...args: any[]) => number): RibbonGenerator; + startAngle(angle: number): this; + startAngle(angle: (this: This, d: ChordSubgroupDatum, ...args: any[]) => number): this; endAngle(): (this: This, d: ChordSubgroupDatum, ...args: any[]) => number; - endAngle(angle: number): RibbonGenerator; - endAngle(angle: (this: This, d: ChordSubgroupDatum, ...args: any[]) => number): RibbonGenerator; + endAngle(angle: number): this; + endAngle(angle: (this: This, d: ChordSubgroupDatum, ...args: any[]) => number): this; context(): CanvasRenderingContext2D | null; - context(context: CanvasRenderingContext2D): RibbonGenerator; - context(context: null): RibbonGenerator; + context(context: CanvasRenderingContext2D): this; + context(context: null): this; } export function ribbon(): RibbonGenerator; diff --git a/d3-collection/index.d.ts b/d3-collection/index.d.ts index fea25224a4..889879681f 100644 --- a/d3-collection/index.d.ts +++ b/d3-collection/index.d.ts @@ -1,6 +1,6 @@ // Type definitions for D3JS d3-collection module 1.0.0 // Project: https://github.com/d3/d3-collection/ -// Definitions by: Alex Ford , Boris Yankov , Tom Wanzek +// Definitions by: Tom Wanzek , Alex Ford , Boris Yankov // Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped /** @@ -104,10 +104,10 @@ export interface NestedObject { } interface Nest { - key(func: (datum: Datum) => string): Nest; - sortKeys(comparator: (a: string, b: string) => number): Nest; - sortValues(comparator: (a: Datum, b: Datum) => number): Nest; - rollup(func: (values: Datum[]) => RollupType): Nest; + key(func: (datum: Datum) => string): this; + sortKeys(comparator: (a: string, b: string) => number): this; + sortValues(comparator: (a: Datum, b: Datum) => number): this; + rollup(func: (values: Datum[]) => RollupType): this; map(array: Datum[]): Map; // more specifically it returns NestedMap object(array: Datum[]): { [key: string]: any }; // more specifically it returns NestedObject entries(array: Datum[]): Array<{ key: string; values: any; value: RollupType | undefined }>; // more specifically it returns NestedArray diff --git a/d3-color/index.d.ts b/d3-color/index.d.ts index e13aafbe6c..36124b3a03 100644 --- a/d3-color/index.d.ts +++ b/d3-color/index.d.ts @@ -1,6 +1,6 @@ // Type definitions for D3JS d3-color module 1.0.0 // Project: https://github.com/d3/d3-color/ -// Definitions by: Alex Ford , Boris Yankov , Tom Wanzek +// Definitions by: Tom Wanzek , Alex Ford , Boris Yankov // Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped // --------------------------------------------------------------------------- @@ -12,6 +12,17 @@ */ export type ColorSpaceObject = RGBColor | HSLColor | LabColor | HCLColor | CubehelixColor; +/** + * A helper interface of methods common to color objects (including colors defined outside the d3-color standard module, + * e.g. in d3-hsv). This interface + */ +export interface ColorCommonInstance { + displayable(): boolean; + toString(): string; + brighter(k?: number): this; + darker(k?: number): this; + rgb(): RGBColor; +} export interface Color { displayable(): boolean; // Note: While this method is used in prototyping for colors of specific colorspaces, it should not be called directly, as 'this.rgb' would not be implemented on Color @@ -20,7 +31,7 @@ export interface Color { export interface ColorFactory extends Function { (cssColorSpecifier: string): RGBColor | HSLColor; - (color: ColorSpaceObject): RGBColor | HSLColor; + (color: ColorSpaceObject | ColorCommonInstance): RGBColor | HSLColor; // prototype: Color; } @@ -29,8 +40,8 @@ export interface RGBColor extends Color { g: number; b: number; opacity: number; - brighter(k?: number): RGBColor; - darker(k?: number): RGBColor; + brighter(k?: number): this; + darker(k?: number): this; displayable(): boolean; rgb(): RGBColor; toString(): string; @@ -39,7 +50,7 @@ export interface RGBColor extends Color { export interface RGBColorFactory extends Function { (r: number, g: number, b: number, opacity?: number): RGBColor; (cssColorSpecifier: string): RGBColor; - (color: ColorSpaceObject): RGBColor; + (color: ColorSpaceObject | ColorCommonInstance): RGBColor; // prototype: RGBColor; } @@ -48,8 +59,8 @@ export interface HSLColor extends Color { s: number; l: number; opacity: number; - brighter(k?: number): HSLColor; - darker(k?: number): HSLColor; + brighter(k?: number): this; + darker(k?: number): this; displayable(): boolean; rgb(): RGBColor; } @@ -57,7 +68,7 @@ export interface HSLColor extends Color { export interface HSLColorFactory extends Function { (h: number, s: number, l: number, opacity?: number): HSLColor; (cssColorSpecifier: string): HSLColor; - (color: ColorSpaceObject): HSLColor; + (color: ColorSpaceObject | ColorCommonInstance): HSLColor; // prototype: HSLColor; } @@ -66,15 +77,15 @@ export interface LabColor extends Color { a: number; b: number; opacity: number; - brighter(k?: number): LabColor; - darker(k?: number): LabColor; + brighter(k?: number): this; + darker(k?: number): this; rgb(): RGBColor; } export interface LabColorFactory extends Function { (l: number, a: number, b: number, opacity?: number): LabColor; (cssColorSpecifier: string): LabColor; - (color: ColorSpaceObject): LabColor; + (color: ColorSpaceObject | ColorCommonInstance): LabColor; // prototype: LabColor; } @@ -83,15 +94,15 @@ export interface HCLColor extends Color { c: number; l: number; opacity: number; - brighter(k?: number): HCLColor; - darker(k?: number): HCLColor; + brighter(k?: number): this; + darker(k?: number): this; rgb(): RGBColor; } export interface HCLColorFactory extends Function { (h: number, l: number, c: number, opacity?: number): HCLColor; (cssColorSpecifier: string): HCLColor; - (color: ColorSpaceObject): HCLColor; + (color: ColorSpaceObject | ColorCommonInstance): HCLColor; // prototype: HCLColor; } @@ -100,15 +111,15 @@ export interface CubehelixColor extends Color { s: number; l: number; opacity: number; - brighter(k?: number): CubehelixColor; - darker(k?: number): CubehelixColor; + brighter(k?: number): this; + darker(k?: number): this; rgb(): RGBColor; } export interface CubehelixColorFactory extends Function { (h: number, s: number, l: number, opacity?: number): CubehelixColor; (cssColorSpecifier: string): CubehelixColor; - (color: ColorSpaceObject): CubehelixColor; + (color: ColorSpaceObject | ColorCommonInstance): CubehelixColor; // prototype: CubehelixColor; } @@ -127,4 +138,3 @@ export var lab: LabColorFactory; export var hcl: HCLColorFactory; export var cubehelix: CubehelixColorFactory; - diff --git a/d3-dispatch/index.d.ts b/d3-dispatch/index.d.ts index 41f03e75db..00f63de565 100644 --- a/d3-dispatch/index.d.ts +++ b/d3-dispatch/index.d.ts @@ -1,6 +1,6 @@ // Type definitions for D3JS d3-dispatch module 1.0.0 // Project: https://github.com/d3/d3-dispatch/ -// Definitions by: Alex Ford , Boris Yankov , Tom Wanzek +// Definitions by: Tom Wanzek , Alex Ford , Boris Yankov // Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped export interface Dispatch { @@ -9,8 +9,8 @@ export interface Dispatch { copy(): Dispatch; on(typenames: string): (this: T, ...args: any[]) => void; - on(typenames: string, callback: null): Dispatch; - on(typenames: string, callback: (this: T, ...args: any[]) => void): Dispatch; + on(typenames: string, callback: null): this; + on(typenames: string, callback: (this: T, ...args: any[]) => void): this; } export function dispatch(...types: string[]): Dispatch; diff --git a/d3-drag/index.d.ts b/d3-drag/index.d.ts index e6bfc4086b..698dcad238 100644 --- a/d3-drag/index.d.ts +++ b/d3-drag/index.d.ts @@ -1,9 +1,9 @@ // Type definitions for D3JS d3-drag module 1.0.0 // Project: https://github.com/d3/d3-drag/ -// Definitions by: Alex Ford , Boris Yankov , Tom Wanzek +// Definitions by: Tom Wanzek , Alex Ford , Boris Yankov // Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped -import { ArrayLike, Selection } from 'd3-selection'; +import { ArrayLike, Selection, ValueFn } from 'd3-selection'; // -------------------------------------------------------------------------- @@ -35,16 +35,16 @@ export interface SubjectPosition { export interface DragBehavior extends Function { (selection: Selection, ...args: any[]): void; - container(): (this: GElement, datum?: Datum, index?: number, group?: Array | ArrayLike) => DragContainerElement; - container(accessor: (this: GElement, datum?: Datum, index?: number, group?: Array | ArrayLike) => DragContainerElement): DragBehavior; - container(container: DragContainerElement): DragBehavior; - filter(): (this: GElement, datum?: Datum, index?: number, group?: Array | ArrayLike) => boolean; - filter(filterFn: (this: GElement, datum?: Datum, index?: number, group?: Array | ArrayLike) => boolean): DragBehavior; - subject(): (this: GElement, datum?: Datum, index?: number, group?: Array | ArrayLike) => Subject; - subject(accessor: (this: GElement, datum?: Datum, index?: number, group?: Array | ArrayLike) => Subject): DragBehavior; - on(typenames: string): (this: GElement, datum?: Datum, index?: number, group?: Array | ArrayLike) => any; - on(typenames: string, callback: null): DragBehavior; - on(typenames: string, callback: (this: GElement, datum?: Datum, index?: number, group?: Array | ArrayLike) => any): DragBehavior; + container(): ValueFn; + container(accessor: ValueFn): this; + container(container: DragContainerElement): this; + filter(): ValueFn; + filter(filterFn: ValueFn): this; + subject(): ValueFn; + subject(accessor: ValueFn): this; + on(typenames: string): ValueFn; + on(typenames: string, callback: null): this; + on(typenames: string, callback: ValueFn): this; } export function drag(): DragBehavior; @@ -62,9 +62,9 @@ export interface D3DragEvent | ArrayLike) => void; - on(typenames: string, callback: null): D3DragEvent; - on(typenames: string, callback: (this: GElement, datum?: Datum, index?: number, group?: Array | ArrayLike) => void): D3DragEvent; + on(typenames: string): ValueFn; + on(typenames: string, callback: null): this; + on(typenames: string, callback: ValueFn): this; } export function dragDisable(window: Window): void; diff --git a/d3-ease/index.d.ts b/d3-ease/index.d.ts index 9f1ba66de6..b971cc9c14 100644 --- a/d3-ease/index.d.ts +++ b/d3-ease/index.d.ts @@ -1,6 +1,6 @@ // Type definitions for D3JS d3-ease module 1.0.0 // Project: https://github.com/d3/d3-ease/ -// Definitions by: Alex Ford , Boris Yankov , Tom Wanzek +// Definitions by: Tom Wanzek , Alex Ford , Boris Yankov // Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped // -------------------------------------------------------------------------- @@ -8,49 +8,49 @@ // -------------------------------------------------------------------------- -export function easeLinear(normalizedTime: number): number; +export function easeLinear(normalizedTime: number): number; -export function easeQuad(normalizedTime: number): number; -export function easeQuadIn(normalizedTime: number): number; -export function easeQuadOut(normalizedTime: number): number; -export function easeQuadInOut(normalizedTime: number): number; +export function easeQuad(normalizedTime: number): number; +export function easeQuadIn(normalizedTime: number): number; +export function easeQuadOut(normalizedTime: number): number; +export function easeQuadInOut(normalizedTime: number): number; -export function easeCubic(normalizedTime: number): number; -export function easeCubicIn(normalizedTime: number): number; -export function easeCubicOut(normalizedTime: number): number; -export function easeCubicInOut(normalizedTime: number): number; +export function easeCubic(normalizedTime: number): number; +export function easeCubicIn(normalizedTime: number): number; +export function easeCubicOut(normalizedTime: number): number; +export function easeCubicInOut(normalizedTime: number): number; -export function easePoly(normalizedTime: number): number; -export function easePolyIn(normalizedTime: number): number; -export function easePolyOut(normalizedTime: number): number; -export function easePolyInOut(normalizedTime: number): number; +export function easePoly(normalizedTime: number): number; +export function easePolyIn(normalizedTime: number): number; +export function easePolyOut(normalizedTime: number): number; +export function easePolyInOut(normalizedTime: number): number; -export function easeSin(normalizedTime: number): number; -export function easeSinIn(normalizedTime: number): number; -export function easeSinOut(normalizedTime: number): number; -export function easeSinInOut(normalizedTime: number): number; +export function easeSin(normalizedTime: number): number; +export function easeSinIn(normalizedTime: number): number; +export function easeSinOut(normalizedTime: number): number; +export function easeSinInOut(normalizedTime: number): number; -export function easeExp(normalizedTime: number): number; -export function easeExpIn(normalizedTime: number): number; -export function easeExpOut(normalizedTime: number): number; -export function easeExpInOut(normalizedTime: number): number; +export function easeExp(normalizedTime: number): number; +export function easeExpIn(normalizedTime: number): number; +export function easeExpOut(normalizedTime: number): number; +export function easeExpInOut(normalizedTime: number): number; -export function easeCircle(normalizedTime: number): number; -export function easeCircleIn(normalizedTime: number): number; -export function easeCircleOut(normalizedTime: number): number; -export function easeCircleInOut(normalizedTime: number): number; +export function easeCircle(normalizedTime: number): number; +export function easeCircleIn(normalizedTime: number): number; +export function easeCircleOut(normalizedTime: number): number; +export function easeCircleInOut(normalizedTime: number): number; -export function easeBounce(normalizedTime: number): number; -export function easeBounceIn(normalizedTime: number): number; -export function easeBounceOut(normalizedTime: number): number; -export function easeBounceInOut(normalizedTime: number): number; +export function easeBounce(normalizedTime: number): number; +export function easeBounceIn(normalizedTime: number): number; +export function easeBounceOut(normalizedTime: number): number; +export function easeBounceInOut(normalizedTime: number): number; -export function easeBack(normalizedTime: number): number; -export function easeBackIn(normalizedTime: number): number; -export function easeBackOut(normalizedTime: number): number; -export function easeBackInOut(normalizedTime: number): number; +export function easeBack(normalizedTime: number): number; +export function easeBackIn(normalizedTime: number): number; +export function easeBackOut(normalizedTime: number): number; +export function easeBackInOut(normalizedTime: number): number; -export function easeElastic(normalizedTime: number): number; -export function easeElasticIn(normalizedTime: number): number; -export function easeElasticOut(normalizedTime: number): number; -export function easeElasticInOut(normalizedTime: number): number; +export function easeElastic(normalizedTime: number): number; +export function easeElasticIn(normalizedTime: number): number; +export function easeElasticOut(normalizedTime: number): number; +export function easeElasticInOut(normalizedTime: number): number; diff --git a/d3-force/d3-force-tests.ts b/d3-force/d3-force-tests.ts index f7e7ae8a05..eb06dae3fc 100644 --- a/d3-force/d3-force-tests.ts +++ b/d3-force/d3-force-tests.ts @@ -452,22 +452,26 @@ nodeLinkSimulation let f: d3Force.Force; +// getter with generic force returned + f = nodeLinkSimulation.force('charge'); f = nodeLinkSimulation.force('link'); + +// getter with force type cast to improve return type specificity + let fLink: d3Force.ForceLink; -// fLink = nodeLinkSimulation.force('link'); // fails, as ForceLink specific properties are missing from 'generic' force - // Need explicit, careful type casting to a specific force type -fLink = >nodeLinkSimulation.force('link'); +fLink = nodeLinkSimulation.force>('link'); // This is mainly an issue for ForceLinks, if once wants to get the links from an initialized force // or re-set new links for an initialized force, e.g.: -simLinks = (>nodeLinkSimulation.force('link')).links(); +simLinks = nodeLinkSimulation.force>('link').links(); + +// fLink = nodeLinkSimulation.force('link'); // fails, as ForceLink specific properties are missing from 'generic' force -// The same could be followed for custom forces. // on() -------------------------------------------------------------------------------- @@ -511,11 +515,11 @@ nodeSimulation = nodeSimulation.on('tick', null); // restart() -------------------------------------------------------------------------- -nodeLinkSimulation.restart(); +nodeLinkSimulation = nodeLinkSimulation.restart(); // stop() ----------------------------------------------------------------------------- -nodeLinkSimulation.stop(); +nodeLinkSimulation = nodeLinkSimulation.stop(); // tick() ----------------------------------------------------------------------------- diff --git a/d3-force/index.d.ts b/d3-force/index.d.ts index 9d0f0d747f..2e296368be 100644 --- a/d3-force/index.d.ts +++ b/d3-force/index.d.ts @@ -1,6 +1,6 @@ // Type definitions for D3JS d3-force module 1.0.0 // Project: https://github.com/d3/d3-force/ -// Definitions by: Alex Ford , Boris Yankov , Tom Wanzek +// Definitions by: Tom Wanzek , Alex Ford , Boris Yankov // Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped @@ -31,28 +31,28 @@ export interface SimulationLinkDatum { } export interface Simulation> { - restart(): Simulation; - stop(): Simulation; - tick(): Simulation; + restart(): this; + stop(): this; + tick(): void; nodes(): Array; - nodes(nodesData: Array): Simulation; + nodes(nodesData: Array): this; alpha(): number; - alpha(alpha: number): Simulation; + alpha(alpha: number): this; alphaMin(): number; - alphaMin(min: number): Simulation; + alphaMin(min: number): this; alphaDecay(): number; - alphaDecay(decay: number): Simulation; + alphaDecay(decay: number): this; alphaTarget(): number; - alphaTarget(target: number): Simulation; + alphaTarget(target: number): this; velocityDecay(): number; - velocityDecay(decay: number): Simulation; - force(name: string): Force; // force names are arbitrary, so return type inference is not possible - force(name: string, force: null): Simulation; - force(name: string, force: Force): Simulation; + velocityDecay(decay: number): this; + force>(name: string): F; // force names are arbitrary, so return type inference is not possible + force(name: string, force: null): this; + force(name: string, force: Force): this; find(x: number, y: number, radius?: number): NodeDatum | undefined; on(typenames: 'tick' | 'end' | string): (this: Simulation) => void; - on(typenames: 'tick' | 'end' | string, listener: null): Simulation; - on(typenames: 'tick' | 'end' | string, listener: (this: this) => void): Simulation; + on(typenames: 'tick' | 'end' | string, listener: null): this; + on(typenames: 'tick' | 'end' | string, listener: (this: this) => void): this; } export function forceSimulation(nodesData?: Array): Simulation; @@ -65,7 +65,7 @@ export function forceSimulation> { (alpha: number): void; - initialize(nodes: Array): void; + initialize?(nodes: Array): void; } @@ -73,9 +73,9 @@ export interface Force extends Force { x(): number; - x(x: number): ForceCenter; + x(x: number): this; y(): number; - y(y: number): ForceCenter; + y(y: number): this; } export function forceCenter(x?: number, y?: number): ForceCenter; @@ -84,12 +84,12 @@ export function forceCenter(x?: number, y export interface ForceCollide extends Force { radius(): (node: NodeDatum, i: number, nodes: Array) => number; - radius(radius: number): ForceCollide; - radius(radius: (node: NodeDatum, i: number, nodes: Array) => number): ForceCollide; + radius(radius: number): this; + radius(radius: (node: NodeDatum, i: number, nodes: Array) => number): this; strength(): number; - strength(strength: number): ForceCollide; + strength(strength: number): this; iterations(): number; - iterations(iterations: number): ForceCollide; + iterations(iterations: number): this; } export function forceCollide(): ForceCollide; @@ -100,17 +100,17 @@ export function forceCollide(radius: (nod export interface ForceLink> extends Force { links(): Array; - links(links: Array): ForceLink; + links(links: Array): this; id(): (node: NodeDatum, i: number, nodesData: Array) => (string | number); - id(id: (node: NodeDatum, i: number, nodesData: Array) => string): ForceLink; + id(id: (node: NodeDatum, i: number, nodesData: Array) => string): this; distance(): (link: LinkDatum, i: number, links: Array) => number; - distance(distance: number): ForceLink; - distance(distance: (link: LinkDatum, i: number, links: Array) => number): ForceLink; + distance(distance: number): this; + distance(distance: (link: LinkDatum, i: number, links: Array) => number): this; strength(): (link: LinkDatum, i: number, links: Array) => number; - strength(strength: number): ForceLink; - strength(strength: (link: LinkDatum, i: number, links: Array) => number): ForceLink; + strength(strength: number): this; + strength(strength: (link: LinkDatum, i: number, links: Array) => number): this; iterations(): number; - iterations(iterations: number): ForceLink; + iterations(iterations: number): this; } export function forceLink>(): ForceLink; @@ -120,14 +120,14 @@ export function forceLink extends Force { strength(): (d: NodeDatum, i: number, data: Array) => number; - strength(strength: number): ForceManyBody; - strength(strength: (d: NodeDatum, i: number, data: Array) => number): ForceManyBody; + strength(strength: number): this; + strength(strength: (d: NodeDatum, i: number, data: Array) => number): this; theta(): number; - theta(theta: number): ForceManyBody; + theta(theta: number): this; distanceMin(): number; - distanceMin(distance: number): ForceManyBody; + distanceMin(distance: number): this; distanceMax(): number; - distanceMax(distance: number): ForceManyBody; + distanceMax(distance: number): this; } export function forceManyBody(): ForceManyBody; @@ -136,11 +136,11 @@ export function forceManyBody(): ForceMan export interface ForceX extends Force { strength(): (d: NodeDatum, i: number, data: Array) => number; - strength(strength: number): ForceX; - strength(strength: (d: NodeDatum, i: number, data: Array) => number): ForceX; + strength(strength: number): this; + strength(strength: (d: NodeDatum, i: number, data: Array) => number): this; x(): (d: NodeDatum, i: number, data: Array) => number; - x(x: number): ForceX; - x(x: (d: NodeDatum, i: number, data: Array) => number): ForceX; + x(x: number): this; + x(x: (d: NodeDatum, i: number, data: Array) => number): this; } export function forceX(): ForceX; @@ -149,11 +149,11 @@ export function forceX(x: (d: NodeDatum, export interface ForceY extends Force { strength(): (d: NodeDatum, i: number, data: Array) => number; - strength(strength: number): ForceY; - strength(strength: (d: NodeDatum, i: number, data: Array) => number): ForceY; + strength(strength: number): this; + strength(strength: (d: NodeDatum, i: number, data: Array) => number): this; y(): (d: NodeDatum, i: number, data: Array) => number; - y(y: number): ForceY; - y(y: (d: NodeDatum, i: number, data: Array) => number): ForceY; + y(y: number): this; + y(y: (d: NodeDatum, i: number, data: Array) => number): this; } export function forceY(): ForceY; diff --git a/d3-format/index.d.ts b/d3-format/index.d.ts index 0f7275bdc9..31c63f7fdf 100644 --- a/d3-format/index.d.ts +++ b/d3-format/index.d.ts @@ -1,6 +1,6 @@ // Type definitions for D3JS d3-format module 1.0.0 // Project: https://github.com/d3/d3-format/ -// Definitions by: Alex Ford , Boris Yankov , Tom Wanzek +// Definitions by: Tom Wanzek , Alex Ford , Boris Yankov // Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped /** diff --git a/d3-geo/d3-geo-tests.ts b/d3-geo/d3-geo-tests.ts new file mode 100644 index 0000000000..2e9f3e8719 --- /dev/null +++ b/d3-geo/d3-geo-tests.ts @@ -0,0 +1,625 @@ +/** + * Typescript definition tests for d3/d3-geo module + * + * Note: These tests are intended to test the definitions only + * in the sense of typing and call signature consistency. They + * are not intended as functional tests. + */ + +import * as d3Geo from 'd3-geo'; +import { Selection } from 'd3-selection'; + +// ---------------------------------------------------------------------- +// Tests setup +// ---------------------------------------------------------------------- + +interface SampleProperties1 { + name: string; +} + +interface SampleProperties2 { + name: string; + value: number; +} + +const samplePolygon: GeoJSON.Polygon = { + type: 'Polygon', + coordinates: [ + [[0, 0], [0, 90], [90, 0], [0, 0]] + ] +}; + +const sampleSphere: d3Geo.GeoSphere = { + type: 'Sphere' +}; + +const sampleGeometryCollection: GeoJSON.GeometryCollection = { + type: 'GeometryCollection', + geometries: [ + samplePolygon, + samplePolygon + ] +}; + +const sampleExtendedGeometryCollection: d3Geo.ExtendedGeometryCollection = { + type: 'GeometryCollection', + geometries: [ + samplePolygon, + sampleSphere + ] +}; + +const sampleFeature: GeoJSON.Feature = { + type: 'Feature', + geometry: samplePolygon, + properties: { + name: 'Alabama' + } +}; + +const sampleExtendedFeature1: d3Geo.ExtendedFeature = { + type: 'Feature', + geometry: samplePolygon, + properties: { + name: 'Alabama' + } +}; + +const sampleExtendedFeature2: d3Geo.ExtendedFeature = { + type: 'Feature', + geometry: sampleSphere, + properties: { + name: 'earth', + value: 42 + } +}; + +const sampleFeatureCollection: GeoJSON.FeatureCollection = { + type: 'FeatureCollection', + features: [ + sampleFeature, + sampleFeature + ] +}; + +const sampleExtendedFeatureCollection: d3Geo.ExtendedFeatureCollection | d3Geo.ExtendedFeature> = { + type: 'FeatureCollection', + features: [ + sampleExtendedFeature1, + sampleExtendedFeature2 + ] +}; + +// ---------------------------------------------------------------------- +// Spherical Math +// ---------------------------------------------------------------------- + +// geoArea(...) ========================================================= + +let area: number = d3Geo.geoArea(samplePolygon); +area = d3Geo.geoArea(sampleSphere); +area = d3Geo.geoArea(sampleGeometryCollection); +area = d3Geo.geoArea(sampleExtendedGeometryCollection); +area = d3Geo.geoArea(sampleFeature); +area = d3Geo.geoArea(sampleExtendedFeature1); +area = d3Geo.geoArea(sampleExtendedFeature2); +area = d3Geo.geoArea(sampleFeatureCollection); +area = d3Geo.geoArea(sampleExtendedFeatureCollection); + +// geoBounds(...) ========================================================= + +let bounds: [[number, number], [number, number]] = d3Geo.geoBounds(samplePolygon); +bounds = d3Geo.geoBounds(sampleSphere); +bounds = d3Geo.geoBounds(sampleGeometryCollection); +bounds = d3Geo.geoBounds(sampleExtendedGeometryCollection); +bounds = d3Geo.geoBounds(sampleFeature); +bounds = d3Geo.geoBounds(sampleExtendedFeature1); +bounds = d3Geo.geoBounds(sampleExtendedFeature2); +bounds = d3Geo.geoBounds(sampleFeatureCollection); +bounds = d3Geo.geoBounds(sampleExtendedFeatureCollection); + +// geoCentroid(...) ======================================================= + +let centroid: [number, number] = d3Geo.geoCentroid(samplePolygon); +centroid = d3Geo.geoCentroid(sampleSphere); +centroid = d3Geo.geoCentroid(sampleGeometryCollection); +centroid = d3Geo.geoCentroid(sampleExtendedGeometryCollection); +centroid = d3Geo.geoCentroid(sampleFeature); +centroid = d3Geo.geoCentroid(sampleExtendedFeature1); +centroid = d3Geo.geoCentroid(sampleExtendedFeature2); +centroid = d3Geo.geoCentroid(sampleFeatureCollection); +centroid = d3Geo.geoCentroid(sampleExtendedFeatureCollection); + +// geoDistance(...) ======================================================= + +let distance: number = d3Geo.geoDistance([54, 2], [53, 1]); + +// geoLength(...) ========================================================= + +let length: number = d3Geo.geoLength(samplePolygon); +length = d3Geo.geoLength(sampleSphere); +length = d3Geo.geoLength(sampleGeometryCollection); +length = d3Geo.geoLength(sampleExtendedGeometryCollection); +length = d3Geo.geoLength(sampleFeature); +length = d3Geo.geoLength(sampleExtendedFeature1); +length = d3Geo.geoLength(sampleExtendedFeature2); +length = d3Geo.geoLength(sampleFeatureCollection); +length = d3Geo.geoLength(sampleExtendedFeatureCollection); + +// geoInterpolate(...) ==================================================== + +let interpolateFct: (t: number) => [number, number] = d3Geo.geoInterpolate([54, 2], [53, 1]); + +// geoRotation(...) ======================================================= + +// create rotation ----------------------------------------------------- + +let rotation: d3Geo.GeoRotation = d3Geo.geoRotation([90, 45]); +let rotation2: d3Geo.GeoRotation = d3Geo.geoRotation([90, 45, 27.5]); + +// use rotation -------------------------------------------------------- + +let point: [number, number] = rotation([54, 2]); +let inverted: [number, number] = rotation.invert([54, 2]); + +// ---------------------------------------------------------------------- +// Spherical Shapes - geoCircle +// ---------------------------------------------------------------------- + +// Create GeoCircleGenerator ============================================ + +// simple use case +let circleGeneratorSimple: d3Geo.GeoCircleGenerator = d3Geo.geoCircle(); + +// complex use as part of object +class Circulator { + + constructor(radius: number, precision: number) { + this.r = radius; + this.p = precision; + this.circleGenerator = d3Geo.geoCircle() + .radius(function (datum) { + let t: Circulator = this; + let d: [number, number] | undefined = datum; + return this.r; + }) + .precision(function (datum) { + let t: Circulator = this; + let d: [number, number] | undefined = datum; + return this.p; + }) + .center(function (datum) { + let t: Circulator = this; + let d: [number, number] | undefined = datum; + return d ? d : [0, 0]; + }); + } + private r: number; + private p: number; + private circleGenerator: d3Geo.GeoCircleGenerator; + + public getCirclePolygon(center?: [number, number]): GeoJSON.Polygon { + if (center && center.length === 2 && typeof center[0] === 'number' && typeof center[1] === 'number') { + return this.circleGenerator(center); + } else { + return this.circleGenerator(); + } + } +} + +let circulator = new Circulator(50, 2); + +// Configure CircleGenerator ============================================ + +// center(...) ---------------------------------------------------------- + +let centerFctSimple: ((this: any, d: any, ...args: any[]) => [number, number]) = circleGeneratorSimple.center(); + +let c: [number, number] = [54, 2]; + +circleGeneratorSimple = circleGeneratorSimple.center(() => c); +circleGeneratorSimple = circleGeneratorSimple.center(c); + +// radius(...) ----------------------------------------------------------- + +let radius: ((...args: any[]) => number) = circleGeneratorSimple.radius(); +circleGeneratorSimple = circleGeneratorSimple.radius(() => 5); +circleGeneratorSimple = circleGeneratorSimple.radius(2); + +// precision(...) -------------------------------------------------------- + +let precision: ((...args: any[]) => number) = circleGeneratorSimple.precision(); +circleGeneratorSimple = circleGeneratorSimple.precision(() => 5); +circleGeneratorSimple = circleGeneratorSimple.precision(2); + +// Use CircleGenerator ==================================================== + +// use simple geoCircleGenerator +let circlePolygon: GeoJSON.Polygon = circleGeneratorSimple(); + +// use encapsulated geoCircleGenerator +circlePolygon = circulator.getCirclePolygon([5, 5]); +circlePolygon = circulator.getCirclePolygon(); + + +// ---------------------------------------------------------------------- +// Spherical Shapes - geoGraticule +// ---------------------------------------------------------------------- + +// Create GeoGraticuleGenerator ========================================= + +let graticuleGenerator: d3Geo.GeoGraticuleGenerator = d3Geo.geoGraticule(); + +// Configure GeoGraticuleGenerator ======================================= + +// extent(...) ----------------------------------------------------------- + +let extent: [[number, number], [number, number]] = graticuleGenerator.extent(); +graticuleGenerator = graticuleGenerator.extent([[-180, -80], [180, 80]]); + +// extentMajor(...) --------------------------------------------------------- + +let extentMajor: [[number, number], [number, number]] = graticuleGenerator.extentMajor(); +graticuleGenerator = graticuleGenerator.extentMajor([[-180, -80], [180, 80]]); + +// extentMinor(...) --------------------------------------------------------- + +let extentMinor: [[number, number], [number, number]] = graticuleGenerator.extentMinor(); +graticuleGenerator = graticuleGenerator.extentMinor([[-180, -80], [180, 80]]); + +// step(...) ---------------------------------------------------------------- + +let step: [number, number] = graticuleGenerator.step(); +graticuleGenerator = graticuleGenerator.step([10, 10]); + +// stepMajor(...) ----------------------------------------------------------- + +let stepMajor: [number, number] = graticuleGenerator.stepMajor(); +graticuleGenerator = graticuleGenerator.stepMajor([10, 10]); + +// stepMinor(...) ------------------------------------------------------------ + +let stepMinor: [number, number] = graticuleGenerator.stepMinor(); +graticuleGenerator = graticuleGenerator.stepMinor([10, 10]); + +// precision(...) ------------------------------------------------------------- + +let precision1: number = graticuleGenerator.precision(); +graticuleGenerator = graticuleGenerator.precision(5); + +// Use GeoGraticuleGenerator ============================================ + +let multiString: GeoJSON.MultiLineString = graticuleGenerator(); +let lines: GeoJSON.LineString[] = graticuleGenerator.lines(); +let polygon2: GeoJSON.Polygon = graticuleGenerator.outline(); + +// ---------------------------------------------------------------------- +// Raw Projections +// ---------------------------------------------------------------------- + +// Pre-Defined Raw Projection Factories ================================= + +let azimuthalEqualAreaRaw: d3Geo.GeoRawProjection = d3Geo.geoAzimuthalEqualAreaRaw(); +let azimuthalEquidistantRaw: d3Geo.GeoRawProjection = d3Geo.geoAzimuthalEquidistantRaw(); +let conicConformalRaw: d3Geo.GeoRawProjection = d3Geo.geoConicConformalRaw(0, 0); +let conicEqualAreaRaw: d3Geo.GeoRawProjection = d3Geo.geoConicEqualAreaRaw(0, 0); +let conicEquidistantRaw: d3Geo.GeoRawProjection = d3Geo.geoConicEquidistantRaw(0, 0); +let equirectangularRaw: d3Geo.GeoRawProjection = d3Geo.geoEquirectangularRaw(); +let gnomonicRaw: d3Geo.GeoRawProjection = d3Geo.geoGnomonicRaw(); +let mercatorRaw: d3Geo.GeoRawProjection = d3Geo.geoMercatorRaw(); +let orthographicRaw: d3Geo.GeoRawProjection = d3Geo.geoOrthographicRaw(); +let stereographicRaw: d3Geo.GeoRawProjection = d3Geo.geoStereographicRaw(); +let transverseMercatorRaw: d3Geo.GeoRawProjection = d3Geo.geoTransverseMercatorRaw(); + +// Use Raw Projection ===================================================== + +let rawProjectionPoint: [number, number] = azimuthalEqualAreaRaw(54, 2); +let rawProjectionInvertedPoint: [number, number] = azimuthalEqualAreaRaw.invert(180, 6); + + + +// ---------------------------------------------------------------------- +// Pre-Defined Projections +// ---------------------------------------------------------------------- + +// Create predefined Projection from factory ============================= + +let albers: d3Geo.GeoConicProjection = d3Geo.geoAlbers(); +let albersUsa: d3Geo.GeoProjection = d3Geo.geoAlbersUsa(); +let azimuthalEqualArea: d3Geo.GeoProjection = d3Geo.geoAzimuthalEqualArea(); +let azimuthalEquidistant: d3Geo.GeoProjection = d3Geo.geoAzimuthalEquidistant(); +let conicConformal: d3Geo.GeoConicProjection = d3Geo.geoConicConformal(); +let conicEqualArea: d3Geo.GeoConicProjection = d3Geo.geoConicEqualArea(); +let conicEquidistant: d3Geo.GeoConicProjection = d3Geo.geoConicEquidistant(); +let cquirectangular: d3Geo.GeoProjection = d3Geo.geoEquirectangular(); +let gnomonic: d3Geo.GeoProjection = d3Geo.geoGnomonic(); +let mercator: d3Geo.GeoProjection = d3Geo.geoMercator(); +let orthographic: d3Geo.GeoProjection = d3Geo.geoOrthographic(); +let stereographic: d3Geo.GeoProjection = d3Geo.geoStereographic(); +let transverseMercator: d3Geo.GeoProjection = d3Geo.geoTransverseMercator(); + +// ---------------------------------------------------------------------- +// Create New Projections +// ---------------------------------------------------------------------- + + +let geoProjection: d3Geo.GeoProjection = d3Geo.geoProjection(azimuthalEqualAreaRaw); + +let mutate: () => d3Geo.GeoProjection = d3Geo.geoProjectionMutator(() => azimuthalEqualAreaRaw); +let constructedProjection: d3Geo.GeoProjection = mutate(); + +// Use Projection ========================================================== + +let projected: [number, number] = constructedProjection([54, 2]); +let inverted2: [number, number] = constructedProjection.invert([54, 2]); + +// TODO ????? +// let stream: d3Geo.Stream = constructedProjection.stream([54, 2]); + +let clipAngle: number = constructedProjection.clipAngle(); +constructedProjection = constructedProjection.clipAngle(null); +constructedProjection = constructedProjection.clipAngle(45); + +let clipExtent: [[number, number], [number, number]] = constructedProjection.clipExtent(); +constructedProjection = constructedProjection.clipExtent(null); +constructedProjection = constructedProjection.clipExtent([[0, 0], [1, 1]]); + +let scale: number = constructedProjection.scale(); +constructedProjection = constructedProjection.scale(45); + +let translate: [number, number] = constructedProjection.translate(); +constructedProjection = constructedProjection.translate([480, 250]); + +let center: [number, number] = constructedProjection.center(); +constructedProjection = constructedProjection.center([0, 0]); + +let rotate: [number, number, number] = constructedProjection.rotate(); +constructedProjection = constructedProjection.rotate([0, 0]); +constructedProjection = constructedProjection.rotate([0, 0, 0]); + +let precision2: number = constructedProjection.precision(); +constructedProjection = constructedProjection.precision(0.707); + +constructedProjection = constructedProjection.fitExtent([[0, 0], [960, 500]], samplePolygon); +constructedProjection = constructedProjection.fitExtent([[0, 0], [960, 500]], sampleSphere); +constructedProjection = constructedProjection.fitExtent([[0, 0], [960, 500]], sampleGeometryCollection); +constructedProjection = constructedProjection.fitExtent([[0, 0], [960, 500]], sampleExtendedGeometryCollection); +constructedProjection = constructedProjection.fitExtent([[0, 0], [960, 500]], sampleFeature); +constructedProjection = constructedProjection.fitExtent([[0, 0], [960, 500]], sampleExtendedFeature1); +constructedProjection = constructedProjection.fitExtent([[0, 0], [960, 500]], sampleExtendedFeature2); +constructedProjection = constructedProjection.fitExtent([[0, 0], [960, 500]], sampleFeatureCollection); +constructedProjection = constructedProjection.fitExtent([[0, 0], [960, 500]], sampleExtendedFeatureCollection); + +constructedProjection = constructedProjection.fitSize([960, 500], samplePolygon); +constructedProjection = constructedProjection.fitSize([960, 500], sampleSphere); +constructedProjection = constructedProjection.fitSize([960, 500], sampleGeometryCollection); +constructedProjection = constructedProjection.fitSize([960, 500], sampleExtendedGeometryCollection); +constructedProjection = constructedProjection.fitSize([960, 500], sampleFeature); +constructedProjection = constructedProjection.fitSize([960, 500], sampleExtendedFeature1); +constructedProjection = constructedProjection.fitSize([960, 500], sampleExtendedFeature2); +constructedProjection = constructedProjection.fitSize([960, 500], sampleFeatureCollection); +constructedProjection = constructedProjection.fitSize([960, 500], sampleExtendedFeatureCollection); + +// ---------------------------------------------------------------------- +// GeoConicProjection interface +// ---------------------------------------------------------------------- + +// parallels(...) ------------------------------------------------------ +let parallels: [number, number] = conicConformal.parallels(); +conicConformal = conicConformal.parallels([20, 20]); + +// test method inheritance from GeoProjection --------------------------- + +conicConformal = conicConformal.fitSize([960, 500], samplePolygon); // inherited + +// ---------------------------------------------------------------------- +// GeoPath Generator +// ---------------------------------------------------------------------- + +// Create geoPath Generator ============================================= + +let geoPathCanvas: d3Geo.GeoPath; +geoPathCanvas = d3Geo.geoPath(); + +let geoPathSVG: d3Geo.GeoPath>; +geoPathSVG = d3Geo.geoPath>(); + +// Configure geoPath Generator ========================================== + +// projection(...) ------------------------------------------------------ + +geoPathCanvas = geoPathCanvas.projection(azimuthalEqualArea); +let geoPathProjectionMinimal: d3Geo.GeoStreamWrapper = geoPathCanvas.projection(); +let geoPathProjectionUnion: d3Geo.GeoProjection | d3Geo.GeoConicProjection | d3Geo.GeoStreamWrapper = geoPathCanvas.projection(); +let geoPathProjection: d3Geo.GeoProjection = geoPathCanvas.projection(); + +geoPathSVG = geoPathSVG.projection(conicConformal); +let geoPathConicProjection: d3Geo.GeoConicProjection = geoPathSVG.projection(); +// geoPathConicProjection = geoPathSVG.projection(); // fails without casting to GeoConicProjection, or alternatively custom typeguard +// geoPathConicProjection = geoPathSVG.projection(); // fails as SampleProperties does not extend minimal interface + +// context(...) ------------------------------------------------------ + +// minimal context interface +geoPathCanvas = geoPathCanvas.context({ + beginPath: () => { return; }, + moveTo: (x: number, y: number) => { return; }, + lineTo: (x: number, y: number) => { return; }, + arc: (x, y, radius, startAngle, endAngle) => { return; }, + closePath: () => { return; } +}); + + +let geoPathContext: d3Geo.GeoContext = geoPathCanvas.context(); + +// reset +geoPathCanvas = geoPathCanvas.context(null); + +// With canvas 2D rendering context +let canvasContext: CanvasRenderingContext2D; + +geoPathCanvas = geoPathCanvas.context(canvasContext); + +canvasContext = geoPathCanvas.context(); +// canvasContext = geoPathSimple.context(); // fails without casting to CanvasRenderingContext2D +// canvasContext = geoPathSimple.context(); // fails as SampleProperties does not extend GeoCanvas + +// pointRadius(...) ------------------------------------------------------ + +geoPathCanvas = geoPathCanvas.pointRadius(5); +let geoPathCanvasPointRadiusAccessor: (this: any, d: d3Geo.GeoPermissibleObjects, ...args: any[]) => number = geoPathCanvas.pointRadius(); + +geoPathSVG = geoPathSVG.pointRadius(function (datum) { + let that: SVGPathElement = this; + let d: d3Geo.ExtendedFeature = datum; + return datum.properties.name === 'Alabama' ? 10 : 15; +}); + +let geoPathSVGPointRadiusAccessor: (this: SVGPathElement, d: d3Geo.ExtendedFeature, ...args: any[]) => number = geoPathSVG.pointRadius(); +// let geoPathSVGPointRadiusAccessorWrong1: (this: SVGCircleElement, d: d3Geo.ExtendedFeature, ...args: any[]) => number = geoPathSVG.pointRadius(); // fails, mismatch in this context +// let geoPathSVGPointRadiusAccessorWrong2: (this: SVGPathElement, d: d3Geo.GeoGeometryObjects, ...args: any[]) => number = geoPathSVG.pointRadius(); // fails, mismatch in object datum type + +// Use geoPath Generator ================================================ + +// area(...) ------------------------------------------------------ + +let geoPathArea: number = geoPathCanvas.area(samplePolygon); +geoPathArea = geoPathCanvas.area(sampleSphere); +geoPathArea = geoPathCanvas.area(sampleGeometryCollection); +geoPathArea = geoPathCanvas.area(sampleExtendedGeometryCollection); +geoPathArea = geoPathCanvas.area(sampleFeature); +geoPathArea = geoPathCanvas.area(sampleExtendedFeature1); +geoPathArea = geoPathCanvas.area(sampleExtendedFeature2); +geoPathArea = geoPathCanvas.area(sampleFeatureCollection); +geoPathArea = geoPathCanvas.area(sampleExtendedFeatureCollection); + +// geoPathArea = geoPathSVG.area(sampleExtendedFeatureCollection); // fails, wrong data object type + + +// bounds(...) ------------------------------------------------------ + +let geoPathBounds: [[number, number], [number, number]] = geoPathCanvas.bounds(samplePolygon); +geoPathBounds = geoPathCanvas.bounds(sampleSphere); +geoPathBounds = geoPathCanvas.bounds(sampleGeometryCollection); +geoPathBounds = geoPathCanvas.bounds(sampleExtendedGeometryCollection); +geoPathBounds = geoPathCanvas.bounds(sampleFeature); +geoPathBounds = geoPathCanvas.bounds(sampleExtendedFeature1); +geoPathBounds = geoPathCanvas.bounds(sampleExtendedFeature2); +geoPathBounds = geoPathCanvas.bounds(sampleFeatureCollection); +geoPathBounds = geoPathCanvas.bounds(sampleExtendedFeatureCollection); + +// geoPathBounds = geoPathSVG.bounds(sampleExtendedFeatureCollection); // fails, wrong data object type + +// centroid(...) ------------------------------------------------------ + +let geoPathCentroid: [number, number] = geoPathCanvas.centroid(samplePolygon); +geoPathCentroid = geoPathCanvas.centroid(sampleSphere); +geoPathCentroid = geoPathCanvas.centroid(sampleGeometryCollection); +geoPathCentroid = geoPathCanvas.centroid(sampleExtendedGeometryCollection); +geoPathCentroid = geoPathCanvas.centroid(sampleFeature); +geoPathCentroid = geoPathCanvas.centroid(sampleExtendedFeature1); +geoPathCentroid = geoPathCanvas.centroid(sampleExtendedFeature2); +geoPathCentroid = geoPathCanvas.centroid(sampleFeatureCollection); +geoPathCentroid = geoPathCanvas.centroid(sampleExtendedFeatureCollection); + +// geoPathCentroid = geoPathSVG.centroid(sampleExtendedFeatureCollection); // fails, wrong data object type + +// render path to context of get path string---------------------------- + +// render to GeoContext/Canvas + +geoPathCanvas(samplePolygon); +geoPathCanvas(sampleSphere); +geoPathCanvas(sampleGeometryCollection); +geoPathCanvas(sampleExtendedGeometryCollection); +geoPathCanvas(sampleFeature); +geoPathCanvas(sampleExtendedFeature1); +geoPathCanvas(sampleExtendedFeature2); +geoPathCanvas(sampleFeatureCollection); +geoPathCanvas(sampleExtendedFeatureCollection); + +// Use path string generator for SVGPathElement + +let svgPath: Selection, any, any>; +svgPath.attr('d', geoPathSVG); + +let svgCircleWrong: Selection, any, any>; +// svgCircleWrong.attr('d', geoPathSVG); // fails, mismatch in `this` context + +let svgPathWrong: Selection; +// svgPathWrong.attr('d', geoPathSVG); // fails, mismatch in datum type + +// ---------------------------------------------------------------------- +// geoClipExtent +// ---------------------------------------------------------------------- + +let geoClipExtent: d3Geo.GeoExtent = d3Geo.geoClipExtent(); + +// extent(...) ---------------------------------------------------------- + +let extent2: [[number, number], [number, number]] = geoClipExtent.extent(); +geoClipExtent = geoClipExtent.extent([[0, 0], [960, 500]]); + +// stream(...) ---------------------------------------------------------- + +let stream: d3Geo.GeoStream; +stream = geoClipExtent.stream(stream); + +// ---------------------------------------------------------------------- +// Stream interface +// ---------------------------------------------------------------------- + +stream.point(0, 0); +stream.point(0, 0, 0); +stream.lineStart(); +stream.lineEnd(); +stream.polygonStart(); +stream.polygonEnd(); +stream.sphere(); + +// ---------------------------------------------------------------------- +// Context interface +// ---------------------------------------------------------------------- +let context: d3Geo.GeoContext = { + beginPath: () => { return; }, + moveTo: (x: number, y: number) => { return; }, + lineTo: (x: number, y: number) => { return; }, + arc: (x, y, radius, startAngle, endAngle) => { return; }, + closePath: () => { return; } +}; + +// ---------------------------------------------------------------------- +// Projection Streams +// ---------------------------------------------------------------------- + +// geoTransform(...) ==================================================== + +let transformFunction: { stream: (s: d3Geo.GeoStream) => {} } = d3Geo.geoTransform({}); + +interface CustomTranformProto extends d3Geo.GeoTransformPrototype { + a: number; +} + +let customTransformProto: CustomTranformProto; + +customTransformProto = { + point: function (x, y) { + return this.stream.point(x + this.a, -y); + }, + a: 10 +}; + +let t: { stream: (s: d3Geo.GeoStream) => (CustomTranformProto & d3Geo.GeoStream) } = d3Geo.geoTransform(customTransformProto); + +// geoStream(...) ======================================================== + +d3Geo.geoStream(samplePolygon, stream); +d3Geo.geoStream(sampleSphere, stream); +d3Geo.geoStream(sampleGeometryCollection, stream); +d3Geo.geoStream(sampleExtendedGeometryCollection, stream); +d3Geo.geoStream(sampleFeature, stream); +d3Geo.geoStream(sampleExtendedFeature1, stream); +d3Geo.geoStream(sampleExtendedFeature2, stream); +d3Geo.geoStream(sampleFeatureCollection, stream); +d3Geo.geoStream(sampleExtendedFeatureCollection, stream); + diff --git a/d3-geo/index.d.ts b/d3-geo/index.d.ts new file mode 100644 index 0000000000..beac52518d --- /dev/null +++ b/d3-geo/index.d.ts @@ -0,0 +1,358 @@ +// Type definitions for D3JS d3-geo module 1.2.0 +// Project: https://github.com/d3/d3-geo/ +// Definitions by: Hugues Stefanski , Tom Wanzek , Alex Ford , Boris Yankov +// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped + +/// + +// ---------------------------------------------------------------------- +// Shared Interfaces and Types +// ---------------------------------------------------------------------- + +/** + * A basic geometry for a sphere, which is supported by d3-geo + * beyond the GeoJSON geometries. + */ +export interface GeoSphere { + type: 'Sphere'; +} + +/** + * Type Alias for GeoJSON Geometry Object and GeoSphere additional + * geometry supported by d3-geo + */ +export type GeoGeometryObjects = GeoJSON.GeometryObject | GeoSphere; + +/** + * A GeoJSON-style GeometryCollection which supports GeoJSON geometry objects + * and additionally GeoSphere + */ +export interface ExtendedGeometryCollection { + type: string; + bbox?: number[]; + crs?: GeoJSON.CoordinateReferenceSystem; + geometries: GeometryType[]; +} + +/** + * A GeoJSON-style Feature which support features built on GeoJSON GeometryObjects + * or GeoSphere + */ +export interface ExtendedFeature extends GeoJSON.GeoJsonObject { + geometry: GeometryType; + properties: Properties; + id?: string; +} + +/** + * A GeoJSON-style FeatureCollection which supports GeoJSON features + * and features built on GeoSphere + */ +export interface ExtendedFeatureCollection> extends GeoJSON.GeoJsonObject { + features: FeatureType[]; +} + +/** + * Type Alias for permissible objects which can be used with d3-geo + * methods + */ +export type GeoPermissibleObjects = GeoGeometryObjects | ExtendedGeometryCollection | ExtendedFeature | ExtendedFeatureCollection>; + +// ---------------------------------------------------------------------- +// Spherical Math +// ---------------------------------------------------------------------- + +/**Returns the spherical area of the specified GeoJSON feature in steradians. */ +export function geoArea(feature: ExtendedFeature): number; +export function geoArea(feature: ExtendedFeatureCollection>): number; +export function geoArea(feature: GeoGeometryObjects): number; +export function geoArea(feature: ExtendedGeometryCollection): number; + +/**Returns the spherical bounding box for the specified GeoJSON feature. The bounding box is represented by a two-dimensional array: [[left, bottom], [right, top]], where left is the minimum longitude, bottom is the minimum latitude, right is maximum longitude, and top is the maximum latitude. All coordinates are given in degrees. */ +export function geoBounds(feature: ExtendedFeature): [[number, number], [number, number]]; +export function geoBounds(feature: ExtendedFeatureCollection>): [[number, number], [number, number]]; +export function geoBounds(feature: GeoGeometryObjects): [[number, number], [number, number]]; +export function geoBounds(feature: ExtendedGeometryCollection): [[number, number], [number, number]]; + +/**Returns the spherical centroid of the specified GeoJSON feature. See also path.centroid, which computes the projected planar centroid.*/ +export function geoCentroid(feature: ExtendedFeature): [number, number]; +export function geoCentroid(feature: ExtendedFeatureCollection>): [number, number]; +export function geoCentroid(feature: GeoGeometryObjects): [number, number]; +export function geoCentroid(feature: ExtendedGeometryCollection): [number, number]; + +/**Returns the great-arc distance in radians between the two points a and b. Each point must be specified as a two-element array [longitude, latitude] in degrees. */ +export function geoDistance(a: [number, number], b: [number, number]): number; + +/**Returns the great-arc length of the specified GeoJSON feature in radians.*/ +export function geoLength(feature: ExtendedFeature): number; +export function geoLength(feature: ExtendedFeatureCollection>): number; +export function geoLength(feature: GeoGeometryObjects): number; +export function geoLength(feature: ExtendedGeometryCollection): number; + +/**Returns an interpolator function given two points a and b. Each point must be specified as a two-element array [longitude, latitude] in degrees. */ +export function geoInterpolate(a: [number, number], b: [number, number]): (t: number) => [number, number]; + + +export interface GeoRotation { + (point: [number, number]): [number, number]; + invert(point: [number, number]): [number, number]; +} + +/**Returns a rotation function for the given angles, which must be a two- or three-element array of numbers [lambda, phi, gamma] specifying the rotation angles in degrees about each spherical axis. */ +export function geoRotation(angles: [number, number] | [number, number, number]): GeoRotation; + + +// ---------------------------------------------------------------------- +// Spherical Shapes +// ---------------------------------------------------------------------- + +// geoCircle ============================================================ + +export interface GeoCircleGenerator { + /**Returns a new GeoJSON geometry object of type “Polygon” approximating a circle on the surface of a sphere, with the current center, radius and precision. */ + (this: This, d?: Datum, ...args: any[]): GeoJSON.Polygon; + center(): ((this: This, d: Datum, ...args: any[]) => [number, number]); + center(center: [number, number]): this; + center(center: ((this: This, d: Datum, ...args: any[]) => [number, number])): this; + + radius(): ((this: This, d: Datum, ...args: any[]) => number); + radius(radius: number): this; + radius(radius: ((this: This, d: Datum, ...args: any[]) => number)): this; + + precision(): ((this: This, d: Datum, ...args: any[]) => number); + precision(precision: number): this; + precision(precision: (this: This, d: Datum, ...args: any[]) => number): this; +} + +export function geoCircle(): GeoCircleGenerator; +export function geoCircle(): GeoCircleGenerator; +export function geoCircle(): GeoCircleGenerator; + +// geoGraticule ============================================================ + +export interface GeoGraticuleGenerator { + /**Returns a GeoJSON MultiLineString geometry object representing all meridians and parallels for this graticule. */ + (): GeoJSON.MultiLineString; + + lines(): GeoJSON.LineString[]; + outline(): GeoJSON.Polygon; + extent(): [[number, number], [number, number]]; + extent(extent: [[number, number], [number, number]]): this; + extentMajor(): [[number, number], [number, number]]; + extentMajor(extent: [[number, number], [number, number]]): this; + extentMinor(): [[number, number], [number, number]]; + extentMinor(extent: [[number, number], [number, number]]): this; + step(): [number, number]; + step(step: [number, number]): this; + stepMajor(): [number, number]; + stepMajor(step: [number, number]): this; + stepMinor(): [number, number]; + stepMinor(step: [number, number]): this; + precision(): number; + precision(angle: number): this; +} + +export function geoGraticule(): GeoGraticuleGenerator; + +// ---------------------------------------------------------------------- +// Projections +// ---------------------------------------------------------------------- + +export interface GeoStream { + lineEnd(): void; + lineStart(): void; + point(x: number, y: number, z?: number): void; + polygonEnd(): void; + polygonStart(): void; + sphere?(): void; +} + +export interface GeoStreamWrapper { + stream(stream: GeoStream): GeoStream; +} + + +export interface GeoRawProjection { + (longitude: number, latitude: number): [number, number]; + invert?(x: number, y: number): [number, number]; +} + + +export interface GeoProjection extends GeoStreamWrapper { + /**Returns a new array x, y representing the projected point of the given point. The point must be specified as a two-element array [longitude, latitude] in degrees. */ + (point: [number, number]): [number, number] | null; + + center(): [number, number]; + center(point: [number, number]): this; + + clipAngle(): number | null; + clipAngle(angle: null): this; + clipAngle(angle: number): this; + + clipExtent(): [[number, number], [number, number]] | null; + clipExtent(extent: null): this; + clipExtent(extent: [[number, number], [number, number]]): this; + + /**Sets the projection’s scale and translate to fit the specified GeoJSON object in the center of the given extent. */ + fitExtent(extent: [[number, number], [number, number]], object: ExtendedFeature): this; + fitExtent(extent: [[number, number], [number, number]], object: ExtendedFeatureCollection>): this; + fitExtent(extent: [[number, number], [number, number]], object: GeoGeometryObjects): this; + fitExtent(extent: [[number, number], [number, number]], object: ExtendedGeometryCollection): this; + + + /**A convenience method for projection.fitExtent where the top-left corner of the extent is [0,0]. */ + fitSize(size: [number, number], object: ExtendedFeature): this; + fitSize(size: [number, number], object: ExtendedFeatureCollection>): this; + fitSize(size: [number, number], object: GeoGeometryObjects): this; + fitSize(size: [number, number], object: ExtendedGeometryCollection): this; + + /**Returns a new array [longitude, latitude] in degrees representing the unprojected point of the given projected point. */ + invert?(point: [number, number]): [number, number] | null; + + precision(): number; + precision(precision: number): this; + + rotate(): [number, number, number]; + rotate(angles: [number, number] | [number, number, number]): this; + + scale(): number; + scale(scale: number): this; + + translate(): [number, number]; + translate(point: [number, number]): this; +} + +export interface GeoConicProjection extends GeoProjection { + parallels(value: [number, number]): this; + parallels(): [number, number]; +} + + +// geoPath ============================================================== + +export interface GeoContext { + arc(x: number, y: number, radius: number, startAngle: number, endAngle: number, anticlockwise?: boolean): void; + beginPath(): void; + closePath(): void; + lineTo(x: number, y: number): void; + moveTo(x: number, y: number): void; +} + +export interface GeoPath { + + (this: This, object: DatumObject, ...args: any[]): string; + + area(object: DatumObject): number; + bounds(object: DatumObject): [[number, number], [number, number]]; + centroid(object: DatumObject): [number, number]; + context(): C | null; + context(context: GeoContext | null): this; + + /** + * Get the current projection. The generic parameter can be used to cast the result to the + * correct, known type of the projection, e.g. GeoProjection or GeoConicProjection. Otherwise, + * the return type defaults to the minimum type requirement for a projection which + * can be passed into a GeoPath. + */ + projection

(): P | null; + + /** + * Set the projection to the identity projection + */ + projection(projection: null): this; + + /** + * Set the projection to be used with the geo path generator. + */ + projection(projection: GeoProjection): this; + + /** + * Set the projection to be used with the geo path generator to a custom projection. + * Custom projections must minimally contain a stream method. + */ + projection(projection: GeoStreamWrapper): this; + + pointRadius(): (this: This, object: DatumObject, ...args: any[]) => number; + pointRadius(value: number): this; + pointRadius(value: (this: This, object: DatumObject, ...args: any[]) => number): this; + +} + +export function geoPath(): GeoPath; +export function geoPath(): GeoPath; +export function geoPath(): GeoPath; + +// Raw Projections ======================================================== + +export function geoAzimuthalEqualAreaRaw(): GeoRawProjection; +export function geoAzimuthalEquidistantRaw(): GeoRawProjection; +export function geoConicConformalRaw(phi0: number, phi1: number): GeoRawProjection; +export function geoConicEqualAreaRaw(phi0: number, phi1: number): GeoRawProjection; +export function geoConicEquidistantRaw(phi0: number, phi1: number): GeoRawProjection; +export function geoEquirectangularRaw(): GeoRawProjection; +export function geoGnomonicRaw(): GeoRawProjection; +export function geoMercatorRaw(): GeoRawProjection; +export function geoOrthographicRaw(): GeoRawProjection; +export function geoStereographicRaw(): GeoRawProjection; +export function geoTransverseMercatorRaw(): GeoRawProjection; + +// geoProjection ========================================================== + +export function geoProjection(project: GeoRawProjection): GeoProjection; + +// geoProjectionMutator ==================================================== + +export function geoProjectionMutator(factory: (...args: any[]) => GeoRawProjection): () => GeoProjection; + +// Pre-Defined Projections ================================================= + +export function geoAlbers(): GeoConicProjection; +export function geoAlbersUsa(): GeoProjection; +export function geoAzimuthalEqualArea(): GeoProjection; +export function geoAzimuthalEquidistant(): GeoProjection; +export function geoConicConformal(): GeoConicProjection; +export function geoConicEqualArea(): GeoConicProjection; +export function geoConicEquidistant(): GeoConicProjection; +export function geoEquirectangular(): GeoProjection; +export function geoGnomonic(): GeoProjection; +export function geoMercator(): GeoProjection; +export function geoOrthographic(): GeoProjection; +export function geoStereographic(): GeoProjection; +export function geoTransverseMercator(): GeoProjection; + +// geoClipExtent ============================================================= + +export interface GeoExtent { + extent(): [[number, number], [number, number]]; + extent(extent: [[number, number], [number, number]]): this; + stream(stream: GeoStream): GeoStream; +} + + +export function geoClipExtent(): GeoExtent; + +// ---------------------------------------------------------------------- +// Projection Streams +// ---------------------------------------------------------------------- + +// geoTransform(...) ==================================================== + +export interface GeoTransformPrototype { + lineEnd?(this: this & { stream: GeoStream }): void; + lineStart?(this: this & { stream: GeoStream }): void; + point?(this: this & { stream: GeoStream }, x: number, y: number, z?: number): void; + polygonEnd?(this: this & { stream: GeoStream }): void; + polygonStart?(this: this & { stream: GeoStream }): void; + sphere?(this: this & { stream: GeoStream }): void; +} +// TODO: Review whether GeoStreamWrapper should be included into return value union type, i.e. ({ stream: (s: GeoStream) => (T & GeoStream & GeoStreamWrapper)})? +// It probably should be omitted for purposes of this API. The stream method added to (T & GeoStream) is more of a private member used internally to +// implement the Transform factory +export function geoTransform(prototype: T): { stream: (s: GeoStream) => (T & GeoStream) }; + +// geoStream(...) ======================================================= + +export function geoStream(object: ExtendedFeature, stream: GeoStream): void; +export function geoStream(object: ExtendedFeatureCollection>, stream: GeoStream): void; +export function geoStream(object: GeoGeometryObjects, stream: GeoStream): void; +export function geoStream(object: ExtendedGeometryCollection, stream: GeoStream): void; diff --git a/d3-geo/tsconfig.json b/d3-geo/tsconfig.json new file mode 100644 index 0000000000..2ec957f5d4 --- /dev/null +++ b/d3-geo/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "module": "commonjs", + "target": "es6", + "noImplicitAny": true, + "strictNullChecks": false, + "baseUrl": "../", + "typeRoots": [ + "../" + ], + "types": [], + "noEmit": true, + "forceConsistentCasingInFileNames": true + }, + "files": [ + "index.d.ts", + "d3-geo-tests.ts" + ] +} diff --git a/d3-hierarchy/index.d.ts b/d3-hierarchy/index.d.ts index dbd62ddb5b..2009406c82 100644 --- a/d3-hierarchy/index.d.ts +++ b/d3-hierarchy/index.d.ts @@ -1,6 +1,6 @@ // Type definitions for D3JS d3-hierarchy module 1.0.0 // Project: https://github.com/d3/d3-hierarchy/ -// Definitions by: Alex Ford , Boris Yankov , Tom Wanzek +// Definitions by: Tom Wanzek , Alex Ford , Boris Yankov // Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped // ----------------------------------------------------------------------- diff --git a/d3-hsv/d3-hsv-tests.ts b/d3-hsv/d3-hsv-tests.ts new file mode 100644 index 0000000000..fff2e55935 --- /dev/null +++ b/d3-hsv/d3-hsv-tests.ts @@ -0,0 +1,45 @@ +/** + * Typescript definition tests for d3/d3-hsv module + * + * Note: These tests are intended to test the definitions only + * in the sense of typing and call signature consistency. They + * are not intended as functional tests. + */ + +import {hsv, HSVColor} from 'd3-hsv'; +import {rgb, RGBColor} from 'd3-color'; + +let c: RGBColor, + cHSV: HSVColor, + displayable: boolean, + cString: string; + +// hsv signature +cHSV = hsv(120, 0.4, 0.5); +cHSV = hsv(120, 0.4, 0.5, 0.5); + +// specifier signature +cHSV = hsv('rgb(255, 255, 255)'); +cHSV = hsv('rgb(10%, 20%, 30%)'); +cHSV = hsv('rgba(255, 255, 255, 0.4)'); +cHSV = hsv('rgba(10%, 20%, 30%, 0.4)'); +cHSV = hsv('hsl(120, 50%, 20%)'); +cHSV = hsv('hsla(120, 50%, 20%, 0.4)'); +cHSV = hsv('#ffeeaa'); +cHSV = hsv('#fea'); +cHSV = hsv('steelblue'); + +// color signature +c = rgb('steelblue'); +cHSV = hsv(c); +cHSV = hsv(cHSV); + +// method signatures +cHSV = cHSV.brighter(); +cHSV = cHSV.brighter(0.2); +cHSV = cHSV.darker(); +cHSV = cHSV.darker(0.2); +displayable = cHSV.displayable(); +cString = cHSV.toString(); +console.log('Channels = (h : %d, s: %d, v: %d)', cHSV.h, cHSV.s, cHSV.v); +console.log('Opacity = %d', cHSV.opacity); diff --git a/d3-hsv/index.d.ts b/d3-hsv/index.d.ts new file mode 100644 index 0000000000..bc1b775498 --- /dev/null +++ b/d3-hsv/index.d.ts @@ -0,0 +1,26 @@ +// Type definitions for D3JS d3-hsv module 0.0.3 +// Project: https://github.com/d3/d3-hsv/ +// Definitions by: Yuri Feldman +// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped + +import {Color, RGBColor, ColorSpaceObject, ColorCommonInstance} from 'd3-color'; + +type ColorSpaceObjectWithHSV = ColorSpaceObject | HSVColor; + +export interface HSVColorFactory extends Function { + (h: number, s: number, v: number, opacity?: number): HSVColor; + (cssColorSpecifier: string): HSVColor; + (color: HSVColor | ColorSpaceObject | ColorCommonInstance): HSVColor; +} + +export interface HSVColor extends Color { + h: number; + s: number; + v: number; + opacity: number; + brighter(k?: number): this; + darker(k?: number): this; + rgb(): RGBColor; +} + +export var hsv: HSVColorFactory; diff --git a/d3-hsv/tsconfig.json b/d3-hsv/tsconfig.json new file mode 100644 index 0000000000..f6493750fd --- /dev/null +++ b/d3-hsv/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "module": "commonjs", + "target": "es6", + "noImplicitAny": true, + "strictNullChecks": false, + "baseUrl": "../", + "typeRoots": [ + "../" + ], + "types": [], + "noEmit": true, + "forceConsistentCasingInFileNames": true + }, + "files": [ + "index.d.ts", + "d3-hsv-tests.ts" + ] +} diff --git a/d3-interpolate/d3-interpolate-tests.ts b/d3-interpolate/d3-interpolate-tests.ts index 64600ec1f6..2ada5864cd 100644 --- a/d3-interpolate/d3-interpolate-tests.ts +++ b/d3-interpolate/d3-interpolate-tests.ts @@ -6,8 +6,9 @@ * are not intended as functional tests. */ -import * as d3Interpolate from 'd3-interpolate'; import * as d3Color from 'd3-color'; +import * as d3Interpolate from 'd3-interpolate'; +import * as d3Hsv from 'd3-hsv'; // Preparatory steps ------------------------------------------------------------------- @@ -56,6 +57,7 @@ let num: number, arrStr: string[], objKeyVal: { [key: string]: any }, objRGBColor: d3Color.RGBColor, + objHSVColor: d3Hsv.HSVColor, zoom: [number, number, number]; // test interpolate(a, b) signature ---------------------------------------------------- @@ -65,6 +67,7 @@ iNum = d3Interpolate.interpolate('1', 5); // color interpolator returning a color string iString = d3Interpolate.interpolate('seagreen', d3Color.rgb(100, 100, 100)); +iString = d3Interpolate.interpolate('seagreen', d3Hsv.hsv(60, 1, 0.2, 0.4)); iString = d3Interpolate.interpolate('seagreen', 'steelblue'); // as used with valid color name string // date interpolator @@ -168,6 +171,7 @@ arrStr = d3Interpolate.quantize(d3Interpolate.interpolateString('-1', '2 // without gamma correction iString = d3Interpolate.interpolateRgb('seagreen', 'steelblue'); iString = d3Interpolate.interpolateRgb(d3Color.rgb('seagreen'), d3Color.hcl('steelblue')); +iString = d3Interpolate.interpolateRgb(d3Color.rgb('seagreen'), d3Hsv.hsv('steelblue')); str = iString(0.5); // with gamma correction @@ -176,34 +180,41 @@ iString = d3Interpolate.interpolateRgb.gamma(2.2)('purple', 'orange'); // test interpolateRgbBasis(color) and interpolateRgbBasisClosed(color) signatures ------------------------- iString = d3Interpolate.interpolateRgbBasis(['seagreen', d3Color.rgb('steelblue'), 'rgb(100, 100, 100)']); -iString = d3Interpolate.interpolateRgbBasisClosed(['seagreen', d3Color.rgb('steelblue'), 'rgb(100, 100, 100)']); +iString = d3Interpolate.interpolateRgbBasis(['seagreen', d3Hsv.hsv('steelblue'), 'rgb(100, 100, 100)']); +iString = d3Interpolate.interpolateRgbBasisClosed(['seagreen', d3Hsv.hsv('steelblue'), 'rgb(100, 100, 100)']); // test interpolateHsl(a, b) and interpolateHslLong(a, b)---------------------------------------------------------------- iString = d3Interpolate.interpolateHsl('seagreen', 'steelblue'); iString = d3Interpolate.interpolateHsl(d3Color.rgb('seagreen'), d3Color.hcl('steelblue')); +iString = d3Interpolate.interpolateHsl(d3Color.rgb('seagreen'), d3Hsv.hsv('steelblue')); iString = d3Interpolate.interpolateHslLong('seagreen', 'steelblue'); iString = d3Interpolate.interpolateHslLong(d3Color.rgb('seagreen'), d3Color.hcl('steelblue')); +iString = d3Interpolate.interpolateHslLong(d3Color.rgb('seagreen'), d3Hsv.hsv('steelblue')); // test interpolateLab(a, b) -------------------------------------------------------------------------------------------- iString = d3Interpolate.interpolateLab('seagreen', 'steelblue'); iString = d3Interpolate.interpolateLab(d3Color.rgb('seagreen'), d3Color.hcl('steelblue')); +iString = d3Interpolate.interpolateLab(d3Color.rgb('seagreen'), d3Hsv.hsv('steelblue')); // test interpolateHcl(a, b) and interpolateHclLong(a, b) ---------------------------------------------------------------- iString = d3Interpolate.interpolateHcl('seagreen', 'steelblue'); iString = d3Interpolate.interpolateHcl(d3Color.rgb('seagreen'), d3Color.hcl('steelblue')); +iString = d3Interpolate.interpolateHcl(d3Color.rgb('seagreen'), d3Hsv.hsv('steelblue')); iString = d3Interpolate.interpolateHclLong('seagreen', 'steelblue'); iString = d3Interpolate.interpolateHclLong(d3Color.rgb('seagreen'), d3Color.hcl('steelblue')); +iString = d3Interpolate.interpolateHclLong(d3Color.rgb('seagreen'), d3Hsv.hsv('steelblue')); // test interpolateCubehelix(a, b) and interpolateCubehelixLong(a, b) --------------------------------------------------- // without gamma correction iString = d3Interpolate.interpolateCubehelix('seagreen', 'steelblue'); iString = d3Interpolate.interpolateCubehelix(d3Color.rgb('seagreen'), d3Color.hcl('steelblue')); +iString = d3Interpolate.interpolateCubehelix(d3Color.rgb('seagreen'), d3Hsv.hsv('steelblue')); str = iString(0.5); // with gamma correction @@ -212,6 +223,7 @@ iString = d3Interpolate.interpolateCubehelix.gamma(2.2)('purple', 'orange'); // without gamma correction iString = d3Interpolate.interpolateCubehelixLong('seagreen', 'steelblue'); iString = d3Interpolate.interpolateCubehelixLong(d3Color.rgb('seagreen'), d3Color.hcl('steelblue')); +iString = d3Interpolate.interpolateCubehelixLong(d3Color.rgb('seagreen'), d3Hsv.hsv('steelblue')); str = iString(0.5); // with gamma correction diff --git a/d3-interpolate/index.d.ts b/d3-interpolate/index.d.ts index 31bf7b6350..0b065fe104 100644 --- a/d3-interpolate/index.d.ts +++ b/d3-interpolate/index.d.ts @@ -1,9 +1,9 @@ // Type definitions for D3JS d3-interpolate module 1.1.0 // Project: https://github.com/d3/d3-interpolate/ -// Definitions by: Alex Ford , Boris Yankov , Tom Wanzek +// Definitions by: Tom Wanzek , Alex Ford , Boris Yankov // Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped -import { ColorSpaceObject } from 'd3-color'; +import { ColorCommonInstance } from 'd3-color'; // -------------------------------------------------------------------------- @@ -20,7 +20,7 @@ export interface ZoomInterpolator extends Function { } export interface ColorGammaInterpolationFactory extends Function { - (a: string | ColorSpaceObject, b: string | ColorSpaceObject): ((t: number) => string); + (a: string | ColorCommonInstance, b: string | ColorCommonInstance): ((t: number) => string); gamma(g: number): ColorGammaInterpolationFactory; } @@ -39,7 +39,7 @@ export type ZoomView = [number, number, number]; export function interpolate(a: any, b: null): ((t: number) => null); export function interpolate(a: number | { valueOf(): number }, b: number): ((t: number) => number); -export function interpolate(a: any, b: ColorSpaceObject): ((t: number) => string); +export function interpolate(a: any, b: ColorCommonInstance): ((t: number) => string); export function interpolate(a: Date, b: Date): ((t: number) => Date); export function interpolate(a: string | { toString(): string }, b: string): ((t: number) => string); export function interpolate>(a: Array, b: U): ((t: number) => U); @@ -78,14 +78,14 @@ export function quantize(interpolator: ((t: number) => T), n: number): Array< export var interpolateRgb: ColorGammaInterpolationFactory; -export function interpolateRgbBasis(colors: Array): ((t: number) => string); -export function interpolateRgbBasisClosed(colors: Array): ((t: number) => string); +export function interpolateRgbBasis(colors: Array): ((t: number) => string); +export function interpolateRgbBasisClosed(colors: Array): ((t: number) => string); -export function interpolateHsl(a: string | ColorSpaceObject, b: string | ColorSpaceObject): ((t: number) => string); -export function interpolateHslLong(a: string | ColorSpaceObject, b: string | ColorSpaceObject): ((t: number) => string); -export function interpolateLab(a: string | ColorSpaceObject, b: string | ColorSpaceObject): ((t: number) => string); -export function interpolateHcl(a: string | ColorSpaceObject, b: string | ColorSpaceObject): ((t: number) => string); -export function interpolateHclLong(a: string | ColorSpaceObject, b: string | ColorSpaceObject): ((t: number) => string); +export function interpolateHsl(a: string | ColorCommonInstance, b: string | ColorCommonInstance): ((t: number) => string); +export function interpolateHslLong(a: string | ColorCommonInstance, b: string | ColorCommonInstance): ((t: number) => string); +export function interpolateLab(a: string | ColorCommonInstance, b: string | ColorCommonInstance): ((t: number) => string); +export function interpolateHcl(a: string | ColorCommonInstance, b: string | ColorCommonInstance): ((t: number) => string); +export function interpolateHclLong(a: string | ColorCommonInstance, b: string | ColorCommonInstance): ((t: number) => string); export var interpolateCubehelix: ColorGammaInterpolationFactory; export var interpolateCubehelixLong: ColorGammaInterpolationFactory; diff --git a/d3-path/index.d.ts b/d3-path/index.d.ts index 0ff751fcae..6949affa95 100644 --- a/d3-path/index.d.ts +++ b/d3-path/index.d.ts @@ -1,6 +1,6 @@ // Type definitions for D3JS d3-path module 1.0.0 // Project: https://github.com/d3/d3-path/ -// Definitions by: Alex Ford , Boris Yankov , Tom Wanzek +// Definitions by: Tom Wanzek , Alex Ford , Boris Yankov // Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped export interface Path { diff --git a/d3-polygon/index.d.ts b/d3-polygon/index.d.ts index e0e9e4ad7a..ae7e8dfd45 100644 --- a/d3-polygon/index.d.ts +++ b/d3-polygon/index.d.ts @@ -1,6 +1,6 @@ // Type definitions for D3JS d3-polygon module 1.0.0 // Project: https://github.com/d3/d3-polygon/ -// Definitions by: Alex Ford , Boris Yankov , Tom Wanzek +// Definitions by: Tom Wanzek , Alex Ford , Boris Yankov // Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped /** diff --git a/d3-quadtree/index.d.ts b/d3-quadtree/index.d.ts index 94b38e9486..db21e4c920 100644 --- a/d3-quadtree/index.d.ts +++ b/d3-quadtree/index.d.ts @@ -1,6 +1,6 @@ // Type definitions for D3JS d3-quadtree module 1.0.0 // Project: https://github.com/d3/d3-quadtree/ -// Definitions by: Alex Ford , Boris Yankov , Tom Wanzek +// Definitions by: Tom Wanzek , Alex Ford , Boris Yankov // Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped /** @@ -20,27 +20,27 @@ export interface QuadtreeLeaf { * * A child quadrant may be undefined if it is empty. */ -export interface QuadtreeInternalNode extends Array | QuadtreeLeaf | undefined> {} +export interface QuadtreeInternalNode extends Array | QuadtreeLeaf | undefined> { } export interface Quadtree { x(): (d: T) => number; - x(x: (d: T) => number): Quadtree; + x(x: (d: T) => number): this; y(): (d: T) => number; - y(y: (d: T) => number): Quadtree; + y(y: (d: T) => number): this; extent(): [[number, number], [number, number]] | undefined; - extent(extend: [[number, number], [number, number]]): Quadtree; - cover(x: number, y: number): Quadtree; - add(datum: T): Quadtree; - addAll(data: Array): Quadtree; - remove(datum: T): Quadtree; - removeAll(data: Array): Quadtree; + extent(extend: [[number, number], [number, number]]): this; + cover(x: number, y: number): this; + add(datum: T): this; + addAll(data: Array): this; + remove(datum: T): this; + removeAll(data: Array): this; copy(): Quadtree; root(): QuadtreeInternalNode | QuadtreeLeaf; data(): Array; size(): number; find(x: number, y: number, radius?: number): T | undefined; - visit(callback: (node: QuadtreeInternalNode | QuadtreeLeaf, x0: number, y0: number, x1: number, y1: number) => (void | boolean)): Quadtree; - visitAfter(callback: (node: QuadtreeInternalNode | QuadtreeLeaf, x0: number, y0: number, x1: number, y1: number) => void): Quadtree; + visit(callback: (node: QuadtreeInternalNode | QuadtreeLeaf, x0: number, y0: number, x1: number, y1: number) => (void | boolean)): this; + visitAfter(callback: (node: QuadtreeInternalNode | QuadtreeLeaf, x0: number, y0: number, x1: number, y1: number) => void): this; } diff --git a/d3-queue/index.d.ts b/d3-queue/index.d.ts index d57572a423..75f7324d04 100644 --- a/d3-queue/index.d.ts +++ b/d3-queue/index.d.ts @@ -1,6 +1,6 @@ // Type definitions for D3JS d3-queue module 3.0.1 // Project: https://github.com/d3/d3-queue/ -// Definitions by: Alex Ford , Boris Yankov , Tom Wanzek +// Definitions by: Tom Wanzek , Alex Ford , Boris Yankov // Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped /** diff --git a/d3-random/index.d.ts b/d3-random/index.d.ts index 436db7193a..807d217bdb 100644 --- a/d3-random/index.d.ts +++ b/d3-random/index.d.ts @@ -1,6 +1,6 @@ // Type definitions for D3JS d3-random module 1.0.0 // Project: https://github.com/d3/d3-random/ -// Definitions by: Alex Ford , Boris Yankov , Tom Wanzek +// Definitions by: Tom Wanzek , Alex Ford , Boris Yankov // Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped /** diff --git a/d3-scale/index.d.ts b/d3-scale/index.d.ts index fa77f42c0d..26db326b00 100644 --- a/d3-scale/index.d.ts +++ b/d3-scale/index.d.ts @@ -1,6 +1,6 @@ // Type definitions for D3JS d3-scale module 1.0.1 // Project: https://github.com/d3/d3-scale/ -// Definitions by: Alex Ford , Boris Yankov , Tom Wanzek +// Definitions by: Tom Wanzek , Alex Ford , Boris Yankov // Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped import { CountableTimeInterval, TimeInterval } from 'd3-time'; @@ -28,22 +28,22 @@ export interface ScaleLinear { */ invert(value: number | { valueOf(): number }): number; domain(): Array; - domain(domain: Array): ScaleLinear; + domain(domain: Array): this; range(): Array; - range(range: Array): ScaleLinear; + range(range: Array): this; /** * Important: While value should come out of range R, this is method is only applicable to * values that can be coerced to numeric. */ - rangeRound(range: Array): ScaleLinear; + rangeRound(range: Array): this; clamp(): boolean; clamp(clamp: boolean): ScaleLinear; interpolate(): InterpolatorFactory; - interpolate(interpolate: InterpolatorFactory): ScaleLinear; + interpolate(interpolate: InterpolatorFactory): this; interpolate(interpolate: InterpolatorFactory): ScaleLinear; ticks(count?: number): Array; tickFormat(count?: number, specifier?: string): ((d: number | { valueOf(): number }) => string); - nice(count?: number): ScaleLinear; + nice(count?: number): this; copy(): ScaleLinear; } @@ -64,26 +64,26 @@ export interface ScalePower { */ invert(value: number | { valueOf(): number }): number; domain(): Array; - domain(domain: Array): ScalePower; + domain(domain: Array): this; range(): Array; - range(range: Array): ScalePower; + range(range: Array): this; /** * Important: While value should come out of range R, this is method is only applicable to * values that can be coerced to numeric. */ - rangeRound(range: Array): ScalePower; + rangeRound(range: Array): this; clamp(): boolean; - clamp(clamp: boolean): ScalePower; + clamp(clamp: boolean): this; interpolate(): InterpolatorFactory; - interpolate(interpolate: InterpolatorFactory): ScalePower; + interpolate(interpolate: InterpolatorFactory): this; interpolate(interpolate: InterpolatorFactory): ScalePower; ticks(count?: number): Array; tickFormat(count?: number, specifier?: string): ((d: number | { valueOf(): number }) => string); - nice(count?: number): ScalePower; + nice(count?: number): this; copy(): ScalePower; exponent(): number; - exponent(exponent: number): ScalePower; + exponent(exponent: number): this; } export function scalePow(): ScalePower; @@ -107,26 +107,26 @@ export interface ScaleLogarithmic { */ invert(value: number | { valueOf(): number }): number; domain(): Array; - domain(domain: Array): ScaleLogarithmic; + domain(domain: Array): this; range(): Array; - range(range: Array): ScaleLogarithmic; + range(range: Array): this; /** * Important: While value should come out of range R, this is method is only applicable to * values that can be coerced to numeric. */ - rangeRound(range: Array): ScaleLogarithmic; + rangeRound(range: Array): this; clamp(): boolean; - clamp(clamp: boolean): ScaleLogarithmic; + clamp(clamp: boolean): this; interpolate(): InterpolatorFactory; - interpolate(interpolate: InterpolatorFactory): ScaleLogarithmic; + interpolate(interpolate: InterpolatorFactory): this; interpolate(interpolate: InterpolatorFactory): ScaleLogarithmic; ticks(count?: number): Array; tickFormat(count?: number, specifier?: string): ((d: number | { valueOf(): number }) => string); - nice(count?: number): ScaleLogarithmic; + nice(count?: number): this; copy(): ScaleLogarithmic; base(): number; - base(base: number): ScaleLogarithmic; + base(base: number): this; } export function scaleLog(): ScaleLogarithmic; @@ -146,12 +146,12 @@ export interface ScaleIdentity { */ invert(value: number | { valueOf(): number }): number; domain(): Array; - domain(domain: Array): ScaleIdentity; + domain(domain: Array): this; range(): Array; - range(range: Array): ScaleIdentity; + range(range: Array): this; ticks(count?: number): Array; tickFormat(count?: number, specifier?: string): ((d: number | { valueOf(): number }) => string); - nice(count?: number): ScaleIdentity; + nice(count?: number): this; copy(): ScaleIdentity; } @@ -170,18 +170,18 @@ export interface ScaleTime { */ invert(value: number | { valueOf(): number }): Date; domain(): Array; - domain(domain: Array): ScaleTime; + domain(domain: Array): this; range(): Array; - range(range: Array): ScaleTime; + range(range: Array): this; /** * Important: While value should come out of range R, this is method is only applicable to * values that can be coerced to numeric. */ - rangeRound(range: Array): ScaleTime; + rangeRound(range: Array): this; clamp(): boolean; - clamp(clamp: boolean): ScaleTime; + clamp(clamp: boolean): this; interpolate(): InterpolatorFactory; - interpolate(interpolate: InterpolatorFactory): ScaleTime; + interpolate(interpolate: InterpolatorFactory): this; interpolate(interpolate: InterpolatorFactory): ScaleTime; ticks(): Array; ticks(count: number): Array; @@ -189,9 +189,9 @@ export interface ScaleTime { tickFormat(): ((d: Date) => string); tickFormat(count: number, specifier?: string): ((d: Date) => string); tickFormat(interval: TimeInterval, specifier?: string): ((d: Date) => string); - nice(): ScaleTime; - nice(count: number): ScaleTime; - nice(interval: CountableTimeInterval, step?: number): ScaleTime; + nice(): this; + nice(count: number): this; + nice(interval: CountableTimeInterval, step?: number): this; copy(): ScaleTime; } @@ -209,13 +209,13 @@ export function scaleUtc(): ScaleTime; export interface ScaleSequential { - (value: number): Output; + (value: number | { valueOf(): number }): Output; domain(): [number, number]; - domain(domain: [number | { valueOf(): number }, number | { valueOf(): number }]): ScaleSequential; + domain(domain: [number | { valueOf(): number }, number | { valueOf(): number }]): this; clamp(): boolean; - clamp(clamp: boolean): ScaleSequential; + clamp(clamp: boolean): this; interpolator(): ((t: number) => Output); - interpolator(interpolator: ((t: number) => Output)): ScaleSequential; + interpolator(interpolator: ((t: number) => Output)): this; interpolator(interpolator: ((t: number) => NewOutput)): ScaleSequential; copy(): ScaleSequential; } @@ -255,12 +255,12 @@ export interface ScaleQuantize { */ invertExtent(value: Range): [number, number]; domain(): [number, number]; - domain(domain: [number | { valueOf(): number }, number | { valueOf(): number }]): ScaleQuantize; + domain(domain: [number | { valueOf(): number }, number | { valueOf(): number }]): this; range(): Array; - range(range: Array): ScaleQuantize; + range(range: Array): this; ticks(count?: number): Array; tickFormat(count?: number, specifier?: string): ((d: number | { valueOf(): number }) => string); - nice(count?: number): ScaleQuantize; + nice(count?: number): this; copy(): ScaleQuantize; } @@ -275,9 +275,9 @@ export interface ScaleQuantile { (value: number | { valueOf(): number }): Range; invertExtent(value: Range): [number, number]; domain(): Array; - domain(domain: Array): ScaleQuantile; + domain(domain: Array): this; range(): Array; - range(range: Array): ScaleQuantile; + range(range: Array): this; quantiles(): Array; copy(): ScaleQuantile; } @@ -298,9 +298,9 @@ export interface ScaleThreshold { */ invertExtent(value: Range): [Domain, Domain] | [undefined, Domain] | [Domain, undefined] | [undefined, undefined]; domain(): Array; - domain(domain: Array): ScaleThreshold; + domain(domain: Array): this; range(): Array; - range(range: Array): ScaleThreshold; + range(range: Array): this; copy(): ScaleThreshold; } @@ -315,11 +315,11 @@ export function scaleThreshold(): export interface ScaleOrdinal { (x: Domain): Range; domain(): Array; - domain(domain: Array): ScaleOrdinal; + domain(domain: Array): this; range(): Array; - range(range: Array): ScaleOrdinal; + range(range: Array): this; unknown(): Range | { name: 'implicit' }; - unknown(value: Range | { name: 'implicit' }): ScaleOrdinal; + unknown(value: Range | { name: 'implicit' }): this; copy(): ScaleOrdinal; } @@ -336,16 +336,16 @@ export const scaleImplicit: { name: 'implicit' }; export interface ScaleBand { (x: Domain): number | undefined; domain(): Array; - domain(domain: Array): ScaleBand; + domain(domain: Array): this; range(): [number, number]; - range(range: [number | { valueOf(): number }, number | { valueOf(): number }]): ScaleBand; - rangeRound(range: [number | { valueOf(): number }, number | { valueOf(): number }]): ScaleBand; + range(range: [number | { valueOf(): number }, number | { valueOf(): number }]): this; + rangeRound(range: [number | { valueOf(): number }, number | { valueOf(): number }]): this; round(): boolean; - round(round: boolean): ScaleBand; + round(round: boolean): this; paddingInner(): number; - paddingInner(padding: number): ScaleBand; + paddingInner(padding: number): this; paddingOuter(): number; - paddingOuter(padding: number): ScaleBand; + paddingOuter(padding: number): this; /** * Returns the inner padding. */ @@ -353,9 +353,9 @@ export interface ScaleBand { /** * A convenience method for setting the inner and outer padding to the same padding value. */ - padding(padding: number): ScaleBand; + padding(padding: number): this; align(): number; - align(align: number): ScaleBand; + align(align: number): this; bandwidth(): number; step(): number; copy(): ScaleBand; @@ -371,12 +371,12 @@ export function scaleBand(): ScaleBand { (x: Domain): number | undefined; domain(): Array; - domain(domain: Array): ScalePoint; + domain(domain: Array): this; range(): [number, number]; - range(range: [number | { valueOf(): number }, number | { valueOf(): number }]): ScalePoint; - rangeRound(range: [number | { valueOf(): number }, number | { valueOf(): number }]): ScalePoint; + range(range: [number | { valueOf(): number }, number | { valueOf(): number }]): this; + rangeRound(range: [number | { valueOf(): number }, number | { valueOf(): number }]): this; round(): boolean; - round(round: boolean): ScalePoint; + round(round: boolean): this; /** * Returns the current outer padding which defaults to 0. * The outer padding determines the ratio of the range that is reserved for blank space @@ -388,9 +388,9 @@ export interface ScalePoint { * The outer padding determines the ratio of the range that is reserved for blank space * before the first point and after the last point. */ - padding(padding: number): ScalePoint; + padding(padding: number): this; align(): number; - align(align: number): ScalePoint; + align(align: number): this; bandwidth(): number; step(): number; copy(): ScalePoint; diff --git a/d3-selection-multi/d3-selection-multi-tests.ts b/d3-selection-multi/d3-selection-multi-tests.ts new file mode 100644 index 0000000000..370b02eb5c --- /dev/null +++ b/d3-selection-multi/d3-selection-multi-tests.ts @@ -0,0 +1,198 @@ + +/** + * Typescript definition tests for d3/d3-selection-multi module + * + * Note: These tests are intended to test the definitions only + * in the sense of typing and call signature consistency. They + * are not intended as functional tests. + */ + +import { Selection, ArrayLike } from 'd3-selection'; +import { Transition } from 'd3-transition'; + +import * as d3SelectionMulti from 'd3-selection-multi'; + +let selection: Selection; + +// Selection.attrs + +// Simple object +selection = selection.attrs({ + foo: 1, + bar: '2', + baz: true, +}); + +// Function values +selection = selection.attrs({ + foo: () => 1, + bar: (d) => d, + baz: (d, i) => i !== 0, + bat: function () { + return this.href; + }, +}); + +// Function that returns a map +selection = selection.attrs(function (d) { + return this.id ? null : { id: d }; +}); + +// Selection.styles +// Each test is repeated twice: once without the priority, and another time with + +// Simple object +selection = selection.styles({ + top: 0, + color: 'red', +}); + +selection = selection.styles({ + top: 0, + color: 'red', +}, 'important'); + +// Function values +selection = selection.styles({ + top: (d, i) => i + 'px', + color: d => d, +}); + +selection = selection.styles({ + top: (d, i) => i + 'px', + color: d => d, +}, 'important'); + +// Functions that return a map +selection.styles(function (d) { + return this.id ? { color: 'red' } : { color: d }; +}); + +selection = selection.styles(function (d) { + return this.id ? { color: 'red' } : { color: d }; +}, 'important'); + +// Selection.properties +// Simple object +selection = selection.properties({ + foo: 1, + bar: 'bar', +}); + +// Function values +selection = selection.properties({ + foo: (d, i) => i, + bar: d => d, +}); + +// Function that returns an object +selection = selection.properties(function (d) { + return this.href ? null : { href: d }; +}); + +let transition: Transition; + +// Transition.attrs + +// Simple object +transition = transition.attrs({ + foo: 1, + bar: '2', + baz: true, +}); + +// Function values +transition = transition.attrs({ + foo: () => 1, + bar: (d) => d, + baz: (d, i) => i !== 0, + bat: function () { + return this.href; + }, +}); + +// Function that returns a map +transition = transition.attrs(function (d) { + return this.id ? null : { id: d }; +}); + +// Transition.styles +// As above, the tests are repeated with the priority 'important' passed in + +// Simple object +transition = transition.styles({ + top: 0, + color: 'red', +}); + +transition = transition.styles({ + top: 0, + color: 'red', +}, 'important'); + +// Function values +transition = transition.styles({ + top: (d, i) => i + 'px', + color: d => d, +}); + +transition = transition.styles({ + top: (d, i) => i + 'px', + color: d => d, +}, 'important'); + +// Function that returns a map +transition = transition.styles(function (d) { + return this.id ? { color: 'red' } : { color: d }; +}); + +transition = transition.styles(function (d) { + return this.id ? { color: 'red' } : { color: d }; +}, 'important'); + +// Test ValueMap interface ---------------------------------------------- + +interface SampleDatum { + name: string; + r: number; + filled: boolean; +} + +let valueMap: d3SelectionMulti.ValueMap; + +valueMap = { + foo1: 'test', + foo2: 2, + foo3: true, + foo4: null, + bar1: function (d) { + let that: SVGCircleElement = this; + let datum: SampleDatum = d; + return d.name; + }, + bar2: function (d, i) { + let that: SVGCircleElement = this; + let datum: SampleDatum = d; + let index: number = i; + return d.r; + }, + bar3: function (d, i, g) { + let that: SVGCircleElement = this; + let datum: SampleDatum = d; + let index: number = i; + let group: Array | ArrayLike = g; + return d.filled; + } +}; + +// valueMap = { // fails, as an array is not a permissible value type +// foo1: [1, 2] +// }; + +// valueMap = { // fails, as a ValueFunction returning an array is not a permissible value type +// foo1: function (d) { +// let that: SVGCircleElement = this; +// let datum: SampleDatum = d; +// return [1, 2]; +// } +// }; diff --git a/d3-selection-multi/index.d.ts b/d3-selection-multi/index.d.ts new file mode 100644 index 0000000000..455fe8e91a --- /dev/null +++ b/d3-selection-multi/index.d.ts @@ -0,0 +1,93 @@ +// Type definitions for D3JS d3-selection-multi module 1.0.0 +// Project: https://github.com/d3/d3-selection-multi/ +// Definitions by: Alex Ford , Boris Yankov +// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped + +import {Selection, BaseType, ArrayLike, ValueFn} from 'd3-selection'; +import {Transition} from 'd3-transition'; + + +// An object mapping attribute (or style or property) names to value accessors +export type ValueMap = { [key: string]: number | string | boolean | null | ValueFn }; + +declare module 'd3-selection' { + export interface Selection { + /** + * Set multiple attributes on the given selection. Attribute values may be constant or derived from each node and its bound data. + * + * @param attrs An object used as a map of attribute names to set + */ + attrs(attrs: ValueMap): this; + + /** + * Derive a map of attributes to be set on the selection. + * + * @param attrs A function that returns an object of attribute names and values to set. + */ + attrs(attrs: ValueFn>): this; + + /** + * Set multiple CSS style properties on the given selection. Style properties may be constant or derived from each node and its bound data. + * + * @param style An object used as a map of style properties to set. + * @param priority The CSS priority (either "important" or undefined). + */ + styles(style: ValueMap, priority?: 'important'): this; + + /** + * Derive a map of style properties to be set on the selection. + * + * @param style A function that returns an object of style properties and the values to be set. + * @param priority The CSS priority (either "important" or undefined) + */ + styles(style: ValueFn>, priority?: 'important'): this; + + /** + * Set multiple object properties directly on the selection's node(s). Property values may be constants or derived from each node and its bound data. + * + * @param props An object used as a map of object properties to be set. + */ + properties(props: ValueMap): this; + + /** + * Derive a map of object properties to be set on the selection's node(s). + * + * @param props A function that returns an object of properties and their values. + */ + properties(props: ValueFn>): this; + } +} + +declare module 'd3-transition' { + export interface Transition { + /** + * Set multiple attribute values. The transition will animate from the present value to the new value. Attribute values may be constant or derived from each node and its bound data. + * + * @param attrs An object used as a map of attributes and their values. + */ + attrs(attrs: ValueMap): this; + + /** + * Derive a map of attribute values to set. + * + * @param attrs A function returning a map of attributes and their values. + */ + attrs(attrs: ValueFn>): this; + + /** + * Set multiple style properties. The transition will animate from the present value to the new value. Attribute values may be constant or derived from each node and its bound data. + * + * @param style A map of style properties and their values + * @param priority The CSS priority (either "important" or undefined) + */ + styles(style: ValueMap, priority?: 'important'): this; + + /** + * Derive a map of style properties to be set. + * + * @param style A function returning a map of style properties and their values + * @param priority The CSS priority (either "important" or undefined) + */ + styles(style: ValueFn>, priority?: 'important'): this; + } +} diff --git a/d3-selection-multi/tsconfig.json b/d3-selection-multi/tsconfig.json new file mode 100644 index 0000000000..0cd4419b55 --- /dev/null +++ b/d3-selection-multi/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "module": "commonjs", + "target": "es6", + "noImplicitAny": true, + "strictNullChecks": false, + "baseUrl": "../", + "typeRoots": [ + "../" + ], + "types": [], + "noEmit": true, + "forceConsistentCasingInFileNames": true + }, + "files": [ + "index.d.ts", + "d3-selection-multi-tests.ts" + ] +} diff --git a/d3-selection/d3-selection-tests.ts b/d3-selection/d3-selection-tests.ts index e56005b897..dfcecd457a 100644 --- a/d3-selection/d3-selection-tests.ts +++ b/d3-selection/d3-selection-tests.ts @@ -89,10 +89,9 @@ let body4: d3Selection.Selection = // d3Selection.select(baseTypeEl.node()); // fails as baseTypeEl.node() is not of type HTMLBodyElement -// TODO: The below are related to github issue #2 (BaseType choice) d3Selection.select(xDoc); -// d3Selection.select(xWindow); // Window cannot does not match type BaseType = Element | EnterElement +d3Selection.select(xWindow); // test top-level selectAll() ------------------------------------------------------------- diff --git a/d3-selection/index.d.ts b/d3-selection/index.d.ts index 08c07e3f7c..d63ef95d15 100644 --- a/d3-selection/index.d.ts +++ b/d3-selection/index.d.ts @@ -1,6 +1,6 @@ // Type definitions for D3JS d3-selection module 1.0.0 // Project: https://github.com/d3/d3-selection/ -// Definitions by: Alex Ford , Boris Yankov , Tom Wanzek +// Definitions by: Tom Wanzek , Alex Ford , Boris Yankov // Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped // -------------------------------------------------------------------------- @@ -12,7 +12,7 @@ * without 'd3-selection' trying to use properties internally which would otherwise not * be supported. */ -export type BaseType = Element | EnterElement; +export type BaseType = Element | EnterElement | Window; // export type BaseType = any; // Alternative, very permissive BaseType specification for edge cases export interface ArrayLike { @@ -21,7 +21,7 @@ export interface ArrayLike { [index: number]: T; } -// TODO: Review Use for enter() + export interface EnterElement { ownerDocument: Document; namespaceURI: string; @@ -56,6 +56,11 @@ export type CustomEventParameters = { detail: any; } +/** + * Callback type for selections and transitions + */ +export type ValueFn = (this: Element, datum: Datum, index: number, groups: Array | ArrayLike) => Result; + /** * TransitionLike is a helper interface to represent a quasi-Transition, without specifying the full Transition interface in this file. @@ -70,9 +75,9 @@ export type CustomEventParameters = { export interface TransitionLike { selection(): Selection; on(type: string, listener: null): TransitionLike; - on(type: string, listener: (this: GElement, datum: Datum, index: number, group: Array | ArrayLike) => any): TransitionLike; + on(type: string, listener: ValueFn): TransitionLike; tween(name: string, tweenFn: null): TransitionLike; - tween(name: string, tweenFn: (this: GElement, datum?: Datum, i?: number, group?: GElement[] | ArrayLike) => ((t: number) => void)): TransitionLike; + tween(name: string, tweenFn: ValueFn void)>): TransitionLike; } @@ -100,115 +105,105 @@ interface Selection(selector: string): Selection; select(selector: null): Selection; // _groups are set to empty array, first generic type is set to null by convention - select(selector: (this: GElement, datum?: Datum, index?: number, group?: Array | ArrayLike) => DescElement): Selection; + select(selector: ValueFn): Selection; selectAll(): Selection; // _groups are set to empty array, first generic type is set to null by convention selectAll(selector: null): Selection; // _groups are set to empty array, first generic type is set to null by convention selectAll(selector: string): Selection; - selectAll(selector: (this: GElement, datum?: Datum, index?: number, group?: Array | ArrayLike) => (Array | ArrayLike)): Selection; + selectAll(selector: ValueFn | ArrayLike>): Selection; // Modifying ------------------------------- attr(name: string): string; - attr(name: string, value: null): Selection; - attr(name: string, value: string | number | boolean): Selection; - attr(name: string, value: (this: GElement, datum?: Datum, index?: number, group?: Array | ArrayLike) => (string | number | boolean)): Selection; + attr(name: string, value: null): this; + attr(name: string, value: string | number | boolean): this; + attr(name: string, value: ValueFn): this; classed(name: string): boolean; - classed(name: string, value: boolean): Selection; - classed(name: string, value: (this: GElement, datum?: Datum, index?: number, group?: Array | ArrayLike) => boolean): Selection; + classed(name: string, value: boolean): this; + classed(name: string, value: ValueFn): this; style(name: string): string; - style(name: string, value: null): Selection; - style(name: string, value: string | number | boolean, priority?: null | 'important'): Selection; - style(name: string, value: (this: GElement, datum?: Datum, index?: number, group?: Array | ArrayLike) => (string | number | boolean), priority?: null | 'important'): Selection; + style(name: string, value: null): this; + style(name: string, value: string | number | boolean, priority?: null | 'important'): this; + style(name: string, value: ValueFn, priority?: null | 'important'): this; property(name: string): any; - property(name: string, value: (this: GElement, datum?: Datum, index?: number, group?: Array | ArrayLike) => any): Selection; - property(name: string, value: null): Selection; - property(name: string, value: any): Selection; + property(name: string, value: ValueFn): this; + property(name: string, value: null): this; + property(name: string, value: any): this; text(): string; - text(value: string | number | boolean): Selection; - text(value: (this: GElement, datum?: Datum, index?: number, group?: Array | ArrayLike) => (string | number | boolean)): Selection; + text(value: string | number | boolean): this; + text(value: ValueFn): this; html(): string; - html(value: string): Selection; - html(value: (this: GElement, datum?: Datum, index?: number, group?: Array | ArrayLike) => string): Selection; + html(value: string): this; + html(value: ValueFn): this; append(type: string): Selection; - append(type: (this: GElement, datum?: Datum, index?: number, group?: Array | ArrayLike) => ChildElement): Selection; + append(type: ValueFn): Selection; insert(type: string, before: string): Selection; - insert(type: (this: GElement, datum?: Datum, index?: number, group?: Array | ArrayLike) => ChildElement, before: string): Selection; - insert(type: string, before: (this: GElement, datum?: Datum, index?: number, group?: Array | ArrayLike) => BaseType): Selection; - insert(type: (this: GElement, datum?: Datum, index?: number, group?: Array | ArrayLike) => ChildElement, - before: (this: GElement, datum?: Datum, index?: number, group?: Array | ArrayLike) => BaseType): Selection; + insert(type: ValueFn, before: string): Selection; + insert(type: string, before: ValueFn): Selection; + insert(type: ValueFn, before: ValueFn): Selection; /** * Removes the selected elements from the document. * Returns this selection (the removed elements) which are now detached from the DOM. */ - remove(): Selection; + remove(): this; merge(other: Selection): Selection; - filter(selector: string): Selection; - filter(selector: (this: GElement, datum?: Datum, index?: number, group?: Array | ArrayLike) => boolean): Selection; + filter(selector: string): this; + filter(selector: ValueFn): this; - sort(comparator?: (a: Datum, b: Datum) => number): Selection; + sort(comparator?: (a: Datum, b: Datum) => number): this; - order(): Selection; + order(): this; - raise(): Selection; + raise(): this; - lower(): Selection; + lower(): this; // Data Join --------------------------------- datum(): Datum; datum(value: null): Selection; - datum(value: (this: GElement, datum?: Datum, index?: number, group?: Array | ArrayLike) => NewDatum): Selection; + datum(value: ValueFn): Selection; datum(value: NewDatum): Selection; data(): Datum[]; - data( - data: Array, - key?: (this: GElement | PElement, datum?: Datum | NewDatum, index?: number, group?: Array | ArrayLike) => string - ): Selection; - data( - data: (this: PElement, datum?: PDatum, index?: number, group?: Array | ArrayLike) => Array, - key?: (this: GElement | PElement, datum?: Datum | NewDatum, index?: number, group?: Array | ArrayLike) => string - ): Selection; + data(data: Array, key?: ValueFn): Selection; + data(data: ValueFn>, key?: ValueFn): Selection; - // TODO: Enter Selection returns GElements of type EnterNode, which do not meet the minimum interface of BaseType = Element - // HACK: Keep enter() selection 'as-if' they are of type GElement, while overly permissive, this may be of little practical relevance, - // given that the normal next step is an .append(...), which would address the matter enter(): Selection; - // TODO: Review this: The type Datum on the exit items is actually of the type prior to calling data(...), as by definition, no new data of type NewDatum exists for these + // The type Datum on the exit items is actually of the type prior to calling data(...), as by definition, no new data of type NewDatum exists for these // elements. Due to the chaining, .data(...).exit(...), however, the definition would imply that the exit group elements have assumed the NewDatum type. // This seems to imply the following workaroud: Recast the exit Selection to OldDatum, if needed, or ommit and allow exit group elements to be of type any. exit(): Selection; // Event Handling ------------------- - on(type: string): (this: GElement, datum: Datum, index: number, group: Array | ArrayLike) => void; - on(type: string, listener: null): Selection; - on(type: string, listener: (this: GElement, datum: Datum, index: number, group: Array | ArrayLike) => void, capture?: boolean): Selection; + on(type: string): ValueFn; + on(type: string, listener: null): this; + on(type: string, listener: ValueFn, capture?: boolean): this; - dispatch(type: string, parameters?: CustomEventParameters): Selection; - dispatch(type: string, parameters?: (this: GElement, datum?: Datum, index?: number, group?: Array | ArrayLike) => CustomEventParameters): Selection; + dispatch(type: string, parameters?: CustomEventParameters): this; + dispatch(type: string, parameters?: ValueFn): this; // Control Flow ---------------------- - each(valueFn: (this: GElement, datum?: Datum, index?: number, group?: Array | ArrayLike) => void): Selection; + each(valueFn: ValueFn): this; - call(func: (selection: Selection, ...args: any[]) => void, ...args: any[]): Selection; + call(func: (selection: Selection, ...args: any[]) => void, ...args: any[]): this; empty(): boolean; diff --git a/d3-shape/index.d.ts b/d3-shape/index.d.ts index 9b3ae22708..b7b22d0900 100644 --- a/d3-shape/index.d.ts +++ b/d3-shape/index.d.ts @@ -1,6 +1,6 @@ // Type definitions for D3JS d3-shape module 1.0.0 // Project: https://github.com/d3/d3-shape/ -// Definitions by: Alex Ford , Boris Yankov , Tom Wanzek +// Definitions by: Tom Wanzek , Alex Ford , Boris Yankov // Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped // ----------------------------------------------------------------------------------- @@ -19,26 +19,26 @@ export interface Arc { (this: This, d: Datum, ...args: any[]): string | undefined; centroid(d: Datum, ...args: any[]): [number, number]; innerRadius(): (this: This, d: Datum, ...args: any[]) => number; - innerRadius(radius: number): Arc; - innerRadius(radius: (this: This, d: Datum, ...args: any[]) => number): Arc; + innerRadius(radius: number): this; + innerRadius(radius: (this: This, d: Datum, ...args: any[]) => number): this; outerRadius(): (this: This, d: Datum, ...args: any[]) => number; - outerRadius(radius: number): Arc; - outerRadius(radius: (this: This, d: Datum, ...args: any[]) => number): Arc; + outerRadius(radius: number): this; + outerRadius(radius: (this: This, d: Datum, ...args: any[]) => number): this; cornerRadius(): (this: This, d: Datum, ...args: any[]) => number; - cornerRadius(radius: number): Arc; - cornerRadius(radius: (this: This, d: Datum, ...args: any[]) => number): Arc; + cornerRadius(radius: number): this; + cornerRadius(radius: (this: This, d: Datum, ...args: any[]) => number): this; startAngle(): (this: This, d: Datum, ...args: any[]) => number; - startAngle(angle: number): Arc; - startAngle(angle: (this: This, d: Datum, ...args: any[]) => number): Arc; + startAngle(angle: number): this; + startAngle(angle: (this: This, d: Datum, ...args: any[]) => number): this; endAngle(): (this: This, d: Datum, ...args: any[]) => number; - endAngle(angle: number): Arc; - endAngle(angle: (this: This, d: Datum, ...args: any[]) => number): Arc; + endAngle(angle: number): this; + endAngle(angle: (this: This, d: Datum, ...args: any[]) => number): this; padAngle(): (this: This, d: Datum, ...args: any[]) => number; - padAngle(angle: number): Arc; - padAngle(angle: (this: This, d: Datum, ...args: any[]) => number): Arc; + padAngle(angle: number): this; + padAngle(angle: (this: This, d: Datum, ...args: any[]) => number): this; context(): CanvasRenderingContext2D | null; - context(context: CanvasRenderingContext2D): Arc; - context(context: null): Arc; + context(context: CanvasRenderingContext2D): this; + context(context: null): this; } export function arc(): Arc; @@ -62,24 +62,24 @@ export interface PieArcDatum { export interface Pie { (this: This, data: Array, ...args: any[]): Array>; - value(): (d: Datum, i?: number, data?: Array) => number; - value(value: number): Pie; - value(value: (d: Datum, i?: number, data?: Array) => number): Pie; + value(): (d: Datum, i: number, data: Array) => number; + value(value: number): this; + value(value: (d: Datum, i: number, data: Array) => number): this; sort(): ((a: Datum, b: Datum) => number) | null; - sort(comparator: (a: Datum, b: Datum) => number): Pie; - sort(comparator: null): Pie; + sort(comparator: (a: Datum, b: Datum) => number): this; + sort(comparator: null): this; sortValues(): ((a: number, b: number) => number) | null; - sortValues(comparator: (a: number, b: number) => number): Pie; - sortValues(comparator: null): Pie; + sortValues(comparator: (a: number, b: number) => number): this; + sortValues(comparator: null): this; startAngle(): (this: This, data: Array, ...args: any[]) => number; - startAngle(angle: number): Pie; - startAngle(angle: (this: This, data: Array, ...args: any[]) => number): Pie; + startAngle(angle: number): this; + startAngle(angle: (this: This, data: Array, ...args: any[]) => number): this; endAngle(): (this: This, data: Array, ...args: any[]) => number; - endAngle(angle: number): Pie; - endAngle(angle: (this: This, data: Array, ...args: any[]) => number): Pie; + endAngle(angle: number): this; + endAngle(angle: (this: This, data: Array, ...args: any[]) => number): this; padAngle(): (this: This, data: Array, ...args: any[]) => number; - padAngle(angle: number): Pie; - padAngle(angle: (this: This, data: Array, ...args: any[]) => number): Pie; + padAngle(angle: number): this; + padAngle(angle: (this: This, data: Array, ...args: any[]) => number): this; } export function pie(): Pie; @@ -93,20 +93,20 @@ export function pie(): Pie; export interface Line { (data: Array): string | undefined; - x(): (d: Datum, index?: number, data?: Array) => number; - x(x: number): Line; - x(x: (d: Datum, index?: number, data?: Array) => number): Line; - y(): (d: Datum, index?: number, data?: Array) => number; - y(y: number): Line; - y(y: (d: Datum, index?: number, data?: Array) => number): Line; - defined(): (d: Datum, index?: number, data?: Array) => boolean; - defined(defined: boolean): Line; - defined(defined: (d: Datum, index?: number, data?: Array) => boolean): Line; + x(): (d: Datum, index: number, data: Array) => number; + x(x: number): this; + x(x: (d: Datum, index: number, data: Array) => number): this; + y(): (d: Datum, index: number, data: Array) => number; + y(y: number): this; + y(y: (d: Datum, index: number, data: Array) => number): this; + defined(): (d: Datum, index: number, data: Array) => boolean; + defined(defined: boolean): this; + defined(defined: (d: Datum, index: number, data: Array) => boolean): this; curve(): CurveFactory | CurveFactoryLineOnly; - curve(curve: CurveFactory | CurveFactoryLineOnly): Line; + curve(curve: CurveFactory | CurveFactoryLineOnly): this; context(): CanvasRenderingContext2D | null; - context(context: CanvasRenderingContext2D): Line; - context(context: null): Line; + context(context: CanvasRenderingContext2D): this; + context(context: null): this; } export function line(): Line<[number, number]>; export function line(): Line; @@ -114,20 +114,20 @@ export function line(): Line; export interface RadialLine { (data: Array): string | undefined; - angle(): (d: Datum, index?: number, data?: Array) => number; - angle(angle: number): RadialLine; - angle(angle: (d: Datum, index?: number, data?: Array) => number): RadialLine; - radius(): (d: Datum, index?: number, data?: Array) => number; - radius(radius: number): RadialLine; - radius(radius: (d: Datum, index?: number, data?: Array) => number): RadialLine; - defined(): (d: Datum, index?: number, data?: Array) => boolean; - defined(defined: boolean): RadialLine; - defined(defined: (d: Datum, index?: number, data?: Array) => boolean): RadialLine; + angle(): (d: Datum, index: number, data: Array) => number; + angle(angle: number): this; + angle(angle: (d: Datum, index: number, data: Array) => number): this; + radius(): (d: Datum, index: number, data: Array) => number; + radius(radius: number): this; + radius(radius: (d: Datum, index: number, data: Array) => number): this; + defined(): (d: Datum, index: number, data: Array) => boolean; + defined(defined: boolean): this; + defined(defined: (d: Datum, index: number, data: Array) => boolean): this; curve(): CurveFactory | CurveFactoryLineOnly; - curve(curve: CurveFactory | CurveFactoryLineOnly): RadialLine; + curve(curve: CurveFactory | CurveFactoryLineOnly): this; context(): CanvasRenderingContext2D | null; - context(context: CanvasRenderingContext2D): RadialLine; - context(context: null): RadialLine; + context(context: CanvasRenderingContext2D): this; + context(context: null): this; } export function radialLine(): RadialLine<[number, number]>; @@ -140,32 +140,32 @@ export function radialLine(): RadialLine; export interface Area { (data: Array): string | undefined; - x(): (d: Datum, index?: number, data?: Array) => number; - x(x: number): Area; - x(x: (d: Datum, index?: number, data?: Array) => number): Area; - x0(): (d: Datum, index?: number, data?: Array) => number; - x0(x0: number): Area; - x0(x0: (d: Datum, index?: number, data?: Array) => number): Area; - x1(): ((d: Datum, index?: number, data?: Array) => number) | null; - x1(x: number): Area; - x1(x: (d: Datum, index?: number, data?: Array) => number): Area; - y(): (d: Datum, index?: number, data?: Array) => number; - y(y: number): Area; - y(y: (d: Datum, index?: number, data?: Array) => number): Area; - y0(): (d: Datum, index?: number, data?: Array) => number; - y0(y: number): Area; - y0(y: (d: Datum, index?: number, data?: Array) => number): Area; - y1(): (d: Datum, index?: number, data?: Array) => number; - y1(y: number): Area; - y1(y: (d: Datum, index?: number, data?: Array) => number): Area; - defined(): (d: Datum, index?: number, data?: Array) => boolean; - defined(defined: boolean): Area; - defined(defined: (d: Datum, index?: number, data?: Array) => boolean): Area; + x(): (d: Datum, index: number, data: Array) => number; + x(x: number): this; + x(x: (d: Datum, index: number, data: Array) => number): this; + x0(): (d: Datum, index: number, data: Array) => number; + x0(x0: number): this; + x0(x0: (d: Datum, index: number, data: Array) => number): this; + x1(): ((d: Datum, index: number, data: Array) => number) | null; + x1(x: number): this; + x1(x: (d: Datum, index: number, data: Array) => number): this; + y(): (d: Datum, index: number, data: Array) => number; + y(y: number): this; + y(y: (d: Datum, index: number, data: Array) => number): this; + y0(): (d: Datum, index: number, data: Array) => number; + y0(y: number): this; + y0(y: (d: Datum, index: number, data: Array) => number): this; + y1(): (d: Datum, index: number, data: Array) => number; + y1(y: number): this; + y1(y: (d: Datum, index: number, data: Array) => number): this; + defined(): (d: Datum, index: number, data: Array) => boolean; + defined(defined: boolean): this; + defined(defined: (d: Datum, index: number, data: Array) => boolean): this; curve(): CurveFactory; - curve(curve: CurveFactory): Area; + curve(curve: CurveFactory): this; context(): CanvasRenderingContext2D | null; - context(context: CanvasRenderingContext2D): Area; - context(context: null): Area; + context(context: CanvasRenderingContext2D): this; + context(context: null): this; lineX0(): Line; lineY0(): Line; lineX1(): Line; @@ -178,32 +178,32 @@ export function area(): Area; export interface RadialArea { (data: Array): string | undefined; - angle(): (d: Datum, index?: number, data?: Array) => number; - angle(angle: number): RadialArea; - angle(angle: (d: Datum, index?: number, data?: Array) => number): RadialArea; - startAngle(): (d: Datum, index?: number, data?: Array) => number; - startAngle(angle: number): RadialArea; - startAngle(angle: (d: Datum, index?: number, data?: Array) => number): RadialArea; - endAngle(): ((d: Datum, index?: number, data?: Array) => number) | null; - endAngle(angle: number): RadialArea; - endAngle(angle: (d: Datum, index?: number, data?: Array) => number): RadialArea; - radius(): (d: Datum, index?: number, data?: Array) => number; - radius(radius: number): RadialArea; - radius(radius: (d: Datum, index?: number, data?: Array) => number): RadialArea; - innerRadius(): (d: Datum, index?: number, data?: Array) => number; - innerRadius(radius: number): RadialArea; - innerRadius(radius: (d: Datum, index?: number, data?: Array) => number): RadialArea; - outerRadius(): (d: Datum, index?: number, data?: Array) => number; - outerRadius(radius: number): RadialArea; - outerRadius(radius: (d: Datum, index?: number, data?: Array) => number): RadialArea; - defined(): (d: Datum, index?: number, data?: Array) => boolean; - defined(defined: boolean): RadialArea; - defined(defined: (d: Datum, index?: number, data?: Array) => boolean): RadialArea; + angle(): (d: Datum, index: number, data: Array) => number; + angle(angle: number): this; + angle(angle: (d: Datum, index: number, data: Array) => number): this; + startAngle(): (d: Datum, index: number, data: Array) => number; + startAngle(angle: number): this; + startAngle(angle: (d: Datum, index: number, data: Array) => number): this; + endAngle(): ((d: Datum, index: number, data: Array) => number) | null; + endAngle(angle: number): this; + endAngle(angle: (d: Datum, index: number, data: Array) => number): this; + radius(): (d: Datum, index: number, data: Array) => number; + radius(radius: number): this; + radius(radius: (d: Datum, index: number, data: Array) => number): this; + innerRadius(): (d: Datum, index: number, data: Array) => number; + innerRadius(radius: number): this; + innerRadius(radius: (d: Datum, index: number, data: Array) => number): this; + outerRadius(): (d: Datum, index: number, data: Array) => number; + outerRadius(radius: number): this; + outerRadius(radius: (d: Datum, index: number, data: Array) => number): this; + defined(): (d: Datum, index: number, data: Array) => boolean; + defined(defined: boolean): this; + defined(defined: (d: Datum, index: number, data: Array) => boolean): this; curve(): CurveFactory; - curve(curve: CurveFactory): RadialArea; + curve(curve: CurveFactory): this; context(): CanvasRenderingContext2D | null; - context(context: CanvasRenderingContext2D): RadialArea; - context(context: null): RadialArea; + context(context: CanvasRenderingContext2D): this; + context(context: null): this; lineStartAngle(): RadialLine; lineInnerRadius(): RadialLine; lineEndAngle(): RadialLine; @@ -243,13 +243,13 @@ export var curveBasisOpen: CurveFactory; export var curveBasisClosed: CurveFactory; export interface CurveBundleFactory extends CurveFactoryLineOnly { - beta(beta: number): CurveBundleFactory; + beta(beta: number): this; } export var curveBundle: CurveBundleFactory; export interface CurveCardinalFactory extends CurveFactory { - tension(tension: number): CurveCardinalFactory; + tension(tension: number): this; } export var curveCardinal: CurveCardinalFactory; @@ -257,7 +257,7 @@ export var curveCardinalOpen: CurveCardinalFactory; export var curveCardinalClosed: CurveCardinalFactory; export interface CurveCatmullRomFactory extends CurveFactory { - alpha(alpha: number): CurveCatmullRomFactory; + alpha(alpha: number): this; } export var curveCatmullRom: CurveCatmullRomFactory; @@ -292,15 +292,15 @@ export interface SymbolType { export interface Symbol { (this: This, d?: Datum, ...args: any[]): undefined | string; - size(): (this: This, d?: Datum, ...args: any[]) => number; - size(size: number): Symbol; - size(size: (this: This, d?: Datum, ...args: any[]) => number): Symbol; - type(): (this: This, d?: Datum, ...args: any[]) => SymbolType; - type(type: SymbolType): Symbol; - type(type: (this: This, d?: Datum, ...args: any[]) => SymbolType): Symbol; + size(): (this: This, d: Datum, ...args: any[]) => number; + size(size: number): this; + size(size: (this: This, d: Datum, ...args: any[]) => number): this; + type(): (this: This, d: Datum, ...args: any[]) => SymbolType; + type(type: SymbolType): this; + type(type: (this: This, d: Datum, ...args: any[]) => SymbolType): this; context(): CanvasRenderingContext2D | null; - context(context: CanvasRenderingContext2D): Symbol; - context(context: null): Symbol; + context(context: CanvasRenderingContext2D): this; + context(context: null): this; } @@ -342,21 +342,21 @@ export interface Stack { (data: Array, ...args: any[]): Array>; keys(): (this: This, data: Array, ...args: any[]) => Array; - keys(keys: Array): Stack; - keys(keys: (this: This, data: Array, ...args: any[]) => Array): Stack; + keys(keys: Array): this; + keys(keys: (this: This, data: Array, ...args: any[]) => Array): this; - value(): (d: Datum, key: Key, j?: number, data?: Array) => number; - value(value: number): Stack; - value(value: (d: Datum, key: Key, j?: number, data?: Array) => number): Stack; + value(): (d: Datum, key: Key, j: number, data: Array) => number; + value(value: number): this; + value(value: (d: Datum, key: Key, j: number, data: Array) => number): this; order(): (series: Series) => Array; - order(order: null): Stack; - order(order: Array): Stack; - order(order: (series: Series) => Array): Stack; + order(order: null): this; + order(order: Array): this; + order(order: (series: Series) => Array): this; offset(): (series: Series, order: Array) => void; - offset(offset: null): Stack; - offset(offset: (series: Series, order: Array) => void): Stack; + offset(offset: null): this; + offset(offset: (series: Series, order: Array) => void): this; } diff --git a/d3-time-format/index.d.ts b/d3-time-format/index.d.ts index 425a37b48d..3615911cbd 100644 --- a/d3-time-format/index.d.ts +++ b/d3-time-format/index.d.ts @@ -1,6 +1,6 @@ // Type definitions for d3JS d3-time-format module 2.0.0 // Project: https://github.com/d3/d3-time-format/ -// Definitions by: Alex Ford , Boris Yankov , Tom Wanzek +// Definitions by: Tom Wanzek , Alex Ford , Boris Yankov // Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped /** diff --git a/d3-time/index.d.ts b/d3-time/index.d.ts index 11b055f8c3..99d0ed9d40 100644 --- a/d3-time/index.d.ts +++ b/d3-time/index.d.ts @@ -1,6 +1,6 @@ // Type definitions for D3JS d3-time module 1.0.0 // Project: https://github.com/d3/d3-time/ -// Definitions by: Alex Ford , Boris Yankov , Tom Wanzek +// Definitions by: Tom Wanzek , Alex Ford , Boris Yankov // Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped // --------------------------------------------------------------- @@ -14,7 +14,7 @@ export interface TimeInterval { ceil(date: Date): Date; offset(date: Date, step?: number): Date; range(start: Date, stop: Date, step?: number): Date[]; - filter(test: (date: Date) => boolean): TimeInterval; + filter(test: (date: Date) => boolean): this; } export interface CountableTimeInterval extends TimeInterval { diff --git a/d3-timer/index.d.ts b/d3-timer/index.d.ts index b5b907139a..c5eded7606 100644 --- a/d3-timer/index.d.ts +++ b/d3-timer/index.d.ts @@ -1,6 +1,6 @@ // Type definitions for d3JS d3-timer module 1.0.1 // Project: https://github.com/d3/d3-timer/ -// Definitions by: Alex Ford , Boris Yankov , Tom Wanzek +// Definitions by: Tom Wanzek , Alex Ford , Boris Yankov // Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped /** diff --git a/d3-transition/index.d.ts b/d3-transition/index.d.ts index 39cd5e157f..1f51884f1d 100644 --- a/d3-transition/index.d.ts +++ b/d3-transition/index.d.ts @@ -1,9 +1,9 @@ // Type definitions for D3JS d3-transition module 1.0.0 // Project: https://github.com/d3/d3-transition/ -// Definitions by: Alex Ford , Boris Yankov , Tom Wanzek +// Definitions by: Tom Wanzek , Alex Ford , Boris Yankov // Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped -import { ArrayLike, BaseType, Selection } from 'd3-selection'; +import { ArrayLike, BaseType, Selection, ValueFn } from 'd3-selection'; /** * Extend interface 'Selection' by declaration merging with 'd3-selection' @@ -26,56 +26,56 @@ export interface Transition(selector: string): Transition; - select(selector: (this: GElement, datum?: Datum, index?: number, group?: Array | ArrayLike) => DescElement): Transition; + select(selector: ValueFn): Transition; // NB: while the empty selections (null or undefined selector) are defined on the underlying object, they should not be exposed in the type definition API // as they are meaningless on transitions.) // selectAll(): Transition; // _groups are set to empty array, first generic type is set to undefined by convention // selectAll(selector: null): Transition; // _groups are set to empty array, first generic type is set to undefined by convention selectAll(selector: string): Transition; - selectAll(selector: (this: GElement, datum?: Datum, index?: number, group?: Array | ArrayLike) => (Array | ArrayLike)): Transition; + selectAll(selector: ValueFn | ArrayLike>): Transition; selection(): Selection; transition(): Transition; // Modifying ------------------------------- - attr(name: string, value: null): Transition; - attr(name: string, value: string | number | boolean): Transition; - attr(name: string, value: (this: GElement, datum?: Datum, index?: number, group?: Array | ArrayLike) => (string | number | boolean)): Transition; - attrTween(name: string, tweenFn: (this: GElement, datum?: Datum, i?: number, group?: GElement[] | ArrayLike) => ((t: number) => (string | number | boolean))): Transition; + attr(name: string, value: null): this; + attr(name: string, value: string | number | boolean): this; + attr(name: string, value: ValueFn): this; + attrTween(name: string, tweenFn: ValueFn (string | number | boolean)>): this; - style(name: string, value: null): Transition; - style(name: string, value: string | number | boolean, priority?: null | 'important'): Transition; - style(name: string, value: (this: GElement, datum?: Datum, index?: number, group?: Array | ArrayLike) => (string | number | boolean), priority?: null | 'important'): Transition; - styleTween(name: string, tweenFn: (this: GElement, datum?: Datum, i?: number, group?: GElement[] | ArrayLike) => ((t: number) => (string | number | boolean)), priority?: null | 'important'): Transition; + style(name: string, value: null): this; + style(name: string, value: string | number | boolean, priority?: null | 'important'): this; + style(name: string, value: ValueFn, priority?: null | 'important'): this; + styleTween(name: string, tweenFn: ValueFn (string | number | boolean)>, priority?: null | 'important'): this; - text(value: null): Transition; - text(value: string | number | boolean): Transition; - text(value: (this: GElement, datum?: Datum, index?: number, group?: Array | ArrayLike) => (string | number | boolean)): Transition; + text(value: null): this; + text(value: string | number | boolean): this; + text(value: ValueFn): this; - tween(name: string): (this: GElement, datum?: Datum, i?: number, group?: GElement[] | ArrayLike) => ((t: number) => void); - tween(name: string, tweenFn: null): Transition; - tween(name: string, tweenFn: (this: GElement, datum?: Datum, i?: number, group?: GElement[] | ArrayLike) => ((t: number) => void)): Transition; + tween(name: string): ValueFn void>; + tween(name: string, tweenFn: null): this; + tween(name: string, tweenFn: ValueFn void>): this; - remove(): Transition; + remove(): this; merge(other: Transition): Transition; - filter(filter: string): Transition; - filter(filter: (this: GElement, datum?: Datum, index?: number, group?: Array | ArrayLike) => boolean): Transition; + filter(filter: string): this; + filter(filter: ValueFn): this; // Event Handling ------------------- - on(type: string): (this: GElement, datum: Datum, index: number, group: Array | ArrayLike) => any; - on(type: string, listener: null): Transition; - on(type: string, listener: (this: GElement, datum: Datum, index: number, group: Array | ArrayLike) => any): Transition; + on(type: string): ValueFn; + on(type: string, listener: null): this; + on(type: string, listener: ValueFn): this; // Control Flow ---------------------- - each(valueFn: (this: GElement, datum?: Datum, index?: number, group?: Array | ArrayLike) => void): Transition; + each(valueFn: ValueFn): this; - call(func: (transition: Transition, ...args: any[]) => any, ...args: any[]): Transition; + call(func: (transition: Transition, ...args: any[]) => any, ...args: any[]): this; empty(): boolean; @@ -87,13 +87,13 @@ export interface Transition; + delay(milliseconds: number): this; duration(): number; - duration(milliseconds: number): Transition; + duration(milliseconds: number): this; ease(): (normalizedTime: number) => number; - ease(easingFn: (normalizedTime: number) => number): Transition; + ease(easingFn: (normalizedTime: number) => number): this; } diff --git a/d3-voronoi/index.d.ts b/d3-voronoi/index.d.ts index 8b3ff002e4..29482438c1 100644 --- a/d3-voronoi/index.d.ts +++ b/d3-voronoi/index.d.ts @@ -1,6 +1,6 @@ // Type definitions for D3JS d3-voronoi module 1.0.1 // Project: https://github.com/d3/d3-voronoi/ -// Definitions by: Alex Ford , Boris Yankov , Tom Wanzek +// Definitions by: Tom Wanzek , Alex Ford , Boris Yankov // Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped // -------------------------------------------------------------------------- @@ -53,13 +53,13 @@ export interface VoronoiLink { export interface VoronoiLayout { (data: Array): VoronoiDiagram; x(): (d: T) => number; - x(x: (d: T) => number): VoronoiLayout; + x(x: (d: T) => number): this; y(): (d: T) => number; - y(y: (d: T) => number): VoronoiLayout; + y(y: (d: T) => number): this; extent(): [[number, number], [number, number]] | null; - extent(extent: [[number, number], [number, number]]): VoronoiLayout; + extent(extent: [[number, number], [number, number]]): this; size(): [number, number] | null; - size(size: [number, number]): VoronoiLayout; + size(size: [number, number]): this; polygons(data: Array): Array>; triangles(data: Array): Array>; links(data: Array): Array>; diff --git a/d3-zoom/index.d.ts b/d3-zoom/index.d.ts index f3352168fb..ad48cb80fa 100644 --- a/d3-zoom/index.d.ts +++ b/d3-zoom/index.d.ts @@ -1,9 +1,9 @@ // Type definitions for d3JS d3-zoom module 1.0.2 // Project: https://github.com/d3/d3-zoom/ -// Definitions by: Alex Ford , Boris Yankov , Tom Wanzek +// Definitions by: Tom Wanzek , Alex Ford , Boris Yankov // Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped -import { ArrayLike, Selection, TransitionLike } from 'd3-selection'; +import { ArrayLike, Selection, TransitionLike, ValueFn } from 'd3-selection'; // -------------------------------------------------------------------------- @@ -24,9 +24,9 @@ type ZoomedElementBaseType = Element; */ export interface ZoomScale { domain(): Array; - domain(domain: Array): ZoomScale; + domain(domain: Array): this; range(): Array; - range(range: Array): ZoomScale; + range(range: Array): this; copy(): ZoomScale; invert(value: number): number; } @@ -39,60 +39,48 @@ export interface ZoomScale { export interface ZoomBehavior extends Function { (selection: Selection, ...args: any[]): void; transform(selection: Selection, transform: ZoomTransform): void; - transform(selection: Selection, transform: (this: ZoomRefElement, d?: Datum, i?: number, group?: Array | ArrayLike) => ZoomTransform): void; + transform(selection: Selection, transform: ValueFn): void; transform(transition: TransitionLike, transform: ZoomTransform): void; - transform(transition: TransitionLike, transform: (this: ZoomRefElement, d?: Datum, i?: number, group?: Array | ArrayLike) => ZoomTransform): void; + transform(transition: TransitionLike, transform: ValueFn): void; translateBy(selection: Selection, x: number, y: number): void; - translateBy(selection: Selection, - x: (this: ZoomRefElement, d?: Datum, i?: number, group?: Array | ArrayLike) => number, - y: number): void; - translateBy(selection: Selection, - x: number, - y: (this: ZoomRefElement, d?: Datum, i?: number, group?: Array | ArrayLike) => number): void; - translateBy(selection: Selection, - x: (this: ZoomRefElement, d?: Datum, i?: number, group?: Array | ArrayLike) => number, - y: (this: ZoomRefElement, d?: Datum, i?: number, group?: Array) => number): void; + translateBy(selection: Selection, x: ValueFn, y: number): void; + translateBy(selection: Selection, x: number, y: ValueFn): void; + translateBy(selection: Selection, x: ValueFn, y: ValueFn): void; translateBy(transition: TransitionLike, x: number, y: number): void; - translateBy(transition: TransitionLike, - x: (this: ZoomRefElement, d?: Datum, i?: number, group?: Array | ArrayLike) => number, - y: number): void; - translateBy(transition: TransitionLike, - x: number, - y: (this: ZoomRefElement, d?: Datum, i?: number, group?: Array | ArrayLike) => number): void; - translateBy(transition: TransitionLike, - x: (this: ZoomRefElement, d?: Datum, i?: number, group?: Array | ArrayLike) => number, - y: (this: ZoomRefElement, d?: Datum, i?: number, group?: Array | ArrayLike) => number): void; + translateBy(transition: TransitionLike, x: ValueFn, y: number): void; + translateBy(transition: TransitionLike, x: number, y: ValueFn): void; + translateBy(transition: TransitionLike, x: ValueFn, y: ValueFn): void; scaleBy(selection: Selection, k: number): void; - scaleBy(selection: Selection, k: (this: ZoomRefElement, d?: Datum, i?: number, group?: Array | ArrayLike) => number): void; + scaleBy(selection: Selection, k: ValueFn): void; scaleBy(transition: TransitionLike, k: number): void; - scaleBy(transition: TransitionLike, k: (this: ZoomRefElement, d?: Datum, i?: number, group?: Array | ArrayLike) => number): void; + scaleBy(transition: TransitionLike, k: ValueFn): void; scaleTo(selection: Selection, k: number): void; - scaleTo(selection: Selection, k: (this: ZoomRefElement, d?: Datum, i?: number, group?: Array | ArrayLike) => number): void; + scaleTo(selection: Selection, k: ValueFn): void; scaleTo(transition: TransitionLike, k: number): void; - scaleTo(transition: TransitionLike, k: (this: ZoomRefElement, d?: Datum, i?: number, group?: Array | ArrayLike) => number): void; + scaleTo(transition: TransitionLike, k: ValueFn): void; - filter(): (this: ZoomRefElement, datum: Datum, index: number, group: Array | ArrayLike) => boolean; - filter(filterFn: (this: ZoomRefElement, d?: Datum, index?: number, group?: Array | ArrayLike) => boolean): ZoomBehavior; + filter(): ValueFn; + filter(filterFn: ValueFn): this; - extent(): (this: ZoomRefElement, d: Datum, index: number, group: Array | ArrayLike) => [[number, number], [number, number]]; - extent(extent: [[number, number], [number, number]]): ZoomBehavior; - extent(extent: (this: ZoomRefElement, d?: Datum, index?: number, group?: Array | ArrayLike) => [[number, number], [number, number]]): ZoomBehavior; + extent(): ValueFn; + extent(extent: [[number, number], [number, number]]): this; + extent(extent: ValueFn): this; scaleExtent(): [number, number]; - scaleExtent(extent: [number, number]): ZoomBehavior; + scaleExtent(extent: [number, number]): this; translateExtent(): [[number, number], [number, number]]; - translateExtent(extent: [[number, number], [number, number]]): ZoomBehavior; + translateExtent(extent: [[number, number], [number, number]]): this; duration(): number; - duration(duration: number): ZoomBehavior; + duration(duration: number): this; - on(typenames: string): (this: ZoomRefElement, datum: Datum, index: number, group: Array | ArrayLike) => void; - on(typenames: string, callback: null): ZoomBehavior; - on(typenames: string, callback: (this: ZoomRefElement, datum: Datum, index: number, group: Array | ArrayLike) => void): ZoomBehavior; + on(typenames: string): ValueFn; + on(typenames: string, callback: null): this; + on(typenames: string, callback: ValueFn): this; }