This is an automated email from the ASF dual-hosted git repository. sushuang pushed a commit to branch typescript in repository https://gitbox.apache.org/repos/asf/incubator-echarts.git
commit d69ffcd42058385724ecea0af65a5773df5cf89d Author: 100pah <[email protected]> AuthorDate: Thu Feb 20 02:13:08 2020 +0800 'scale' to ts --- src/coord/axisHelper.ts | 19 +-- src/data/List.ts | 6 +- src/data/OrdinalMeta.ts | 16 +-- src/scale/Interval.ts | 137 +++++++++------------- src/scale/Log.ts | 149 +++++++++++------------ src/scale/Ordinal.ts | 108 ++++++++--------- src/scale/Scale.ts | 273 ++++++++++++++++++++++--------------------- src/scale/Time.ts | 84 +++++++------ src/scale/helper.ts | 47 ++++---- src/util/format.ts | 2 +- src/util/number.ts | 7 +- src/util/types.ts | 10 +- test/build/test-transform.js | 5 +- 13 files changed, 416 insertions(+), 447 deletions(-) diff --git a/src/coord/axisHelper.ts b/src/coord/axisHelper.ts index 071bdde..9e51dd6 100644 --- a/src/coord/axisHelper.ts +++ b/src/coord/axisHelper.ts @@ -34,6 +34,7 @@ import BoundingRect from 'zrender/src/core/BoundingRect'; import '../scale/Time'; import '../scale/Log'; +import TimeScale from '../scale/Time'; /** * Get axis scale extent before niced. @@ -252,17 +253,19 @@ export function createScaleByModel(model, axisType) { switch (axisType) { // Buildin scale case 'category': - return new OrdinalScale( - model.getOrdinalMeta + return new OrdinalScale({ + ordinalMeta: model.getOrdinalMeta ? model.getOrdinalMeta() : model.getCategories(), - [Infinity, -Infinity] - ); - case 'value': - return new IntervalScale(); - // Extended scale, like time and log + extent: [Infinity, -Infinity] + }); + case 'time': + return new TimeScale({ + useUTC: model.ecModel.get('useUTC') + }) default: - return (Scale.getClass(axisType) || IntervalScale).create(model); + // case 'value'/'interval', 'log', or others. + return new (Scale.getClass(axisType) || IntervalScale)(); } } } diff --git a/src/data/List.ts b/src/data/List.ts index 0f2f93c..3fbc763 100644 --- a/src/data/List.ts +++ b/src/data/List.ts @@ -36,7 +36,7 @@ import {ArrayLike, Dictionary, FunctionPropertyNames} from 'zrender/src/core/typ import Element from 'zrender/src/Element'; import { DimensionIndex, DimensionName, ECElement, DimensionLoose, OptionDataItem, - ParsedDataValue, ParsedDataNumeric, OrdinalRawValueIndex, DimensionUserOuput, ModelOption + ParsedDataValue, ParsedDataNumeric, OrdinalNumber, DimensionUserOuput, ModelOption } from '../util/types'; import {parseDate} from '../util/number'; import {isDataItemOption} from '../util/model'; @@ -931,7 +931,7 @@ class List { * @param value ordinal index * @return rawIndex */ - rawIndexOf(dim: DimensionName, value: OrdinalRawValueIndex): number { + rawIndexOf(dim: DimensionName, value: OrdinalNumber): number { var invertedIndices = dim && this._invertedIndicesMap[dim]; if (__DEV__) { if (!invertedIndices) { @@ -1933,7 +1933,7 @@ class List { val = chunk[chunkOffset]; var ordinalMeta = list._dimensionInfos[dim].ordinalMeta; if (ordinalMeta && ordinalMeta.categories.length) { - val = ordinalMeta.categories[val as OrdinalRawValueIndex]; + val = ordinalMeta.categories[val as OrdinalNumber]; } } } diff --git a/src/data/OrdinalMeta.ts b/src/data/OrdinalMeta.ts index 5beb8a1..a387ce9 100644 --- a/src/data/OrdinalMeta.ts +++ b/src/data/OrdinalMeta.ts @@ -19,20 +19,22 @@ import {createHashMap, isObject, map, HashMap} from 'zrender/src/core/util'; import Model from '../model/Model'; +import { OrdinalNumber, OrdinalRawValue } from '../util/types'; + class OrdinalMeta { - readonly categories: string[]; + readonly categories: OrdinalRawValue[]; private _needCollect: boolean; private _deduplication: boolean; - private _map: HashMap<number>; + private _map: HashMap<OrdinalNumber>; constructor(opt: { - categories?: string[], + categories?: OrdinalRawValue[], needCollect?: boolean deduplication?: boolean }) { @@ -54,14 +56,14 @@ class OrdinalMeta { }); }; - getOrdinal(category: string): number { + getOrdinal(category: OrdinalRawValue): OrdinalNumber { return this._getOrCreateMap().get(category); } /** * @return The ordinal. If not found, return NaN. */ - parseAndCollect(category: any): number { + parseAndCollect(category: OrdinalRawValue | OrdinalNumber): OrdinalNumber { var index; var needCollect = this._needCollect; @@ -106,9 +108,9 @@ class OrdinalMeta { } // Consider big data, do not create map until needed. - private _getOrCreateMap(): HashMap<number> { + private _getOrCreateMap(): HashMap<OrdinalNumber> { return this._map || ( - this._map = createHashMap<number>(this.categories) + this._map = createHashMap(this.categories) ); } } diff --git a/src/scale/Interval.ts b/src/scale/Interval.ts index 1fd3fbc..27c65f7 100644 --- a/src/scale/Interval.ts +++ b/src/scale/Interval.ts @@ -17,13 +17,6 @@ * under the License. */ -// @ts-nocheck - -/** - * Interval scale - * @module echarts/scale/Interval - */ - import * as numberUtil from '../util/number'; import * as formatUtil from '../util/format'; @@ -32,67 +25,59 @@ import * as helper from './helper'; var roundNumber = numberUtil.round; -/** - * @alias module:echarts/coord/scale/Interval - * @constructor - */ -var IntervalScale = Scale.extend({ +class IntervalScale extends Scale { - type: 'interval', + static type = 'interval'; - _interval: 0, + // Step is calculated in adjustExtent. + protected _interval: number = 0; + protected _niceExtent: [number, number]; + private _intervalPrecision: number = 2; - _intervalPrecision: 2, - setExtent: function (start, end) { + setExtent(start: number | string, end: number | string): void { var thisExtent = this._extent; - //start,end may be a Number like '25',so... - if (!isNaN(start)) { - thisExtent[0] = parseFloat(start); + // start,end may be a Number like '25',so... + if (!isNaN(start as any)) { + thisExtent[0] = parseFloat(start as any); } - if (!isNaN(end)) { - thisExtent[1] = parseFloat(end); + if (!isNaN(end as any)) { + thisExtent[1] = parseFloat(end as any); } - }, + } - unionExtent: function (other) { + unionExtent(other: [number, number]): void { var extent = this._extent; other[0] < extent[0] && (extent[0] = other[0]); other[1] > extent[1] && (extent[1] = other[1]); // unionExtent may called by it's sub classes - IntervalScale.prototype.setExtent.call(this, extent[0], extent[1]); - }, - /** - * Get interval - */ - getInterval: function () { + this.setExtent(extent[0], extent[1]); + } + + getInterval(): number { return this._interval; - }, + } - /** - * Set interval - */ - setInterval: function (interval) { + setInterval(interval: number): void { this._interval = interval; // Dropped auto calculated niceExtent and use user setted extent // We assume user wan't to set both interval, min, max to get a better result - this._niceExtent = this._extent.slice(); + this._niceExtent = this._extent.slice() as [number, number]; this._intervalPrecision = helper.getIntervalPrecision(interval); - }, + } /** - * @param {boolean} [expandToNicedExtent=false] If expand the ticks to niced extent. - * @return {Array.<number>} + * @param expandToNicedExtent Whether expand the ticks to niced extent. */ - getTicks: function (expandToNicedExtent) { + getTicks(expandToNicedExtent: boolean): number[] { var interval = this._interval; var extent = this._extent; var niceTickExtent = this._niceExtent; var intervalPrecision = this._intervalPrecision; - var ticks = []; + var ticks = [] as number[]; // If interval is 0, return []; if (!interval) { return ticks; @@ -137,13 +122,9 @@ var IntervalScale = Scale.extend({ } return ticks; - }, + } - /** - * @param {number} [splitNumber=5] - * @return {Array.<Array.<number>>} - */ - getMinorTicks: function (splitNumber) { + getMinorTicks(splitNumber: number): number[][] { var ticks = this.getTicks(true); var minorTicks = []; var extent = this.getExtent(); @@ -157,7 +138,7 @@ var IntervalScale = Scale.extend({ var minorInterval = interval / splitNumber; while (count < splitNumber - 1) { - var minorTick = numberUtil.round(prevTick + (count + 1) * minorInterval); + var minorTick = roundNumber(prevTick + (count + 1) * minorInterval); // For the first and last interval. The count may be less than splitNumber. if (minorTick > extent[0] && minorTick < extent[1]) { @@ -169,16 +150,19 @@ var IntervalScale = Scale.extend({ } return minorTicks; - }, + } /** - * @param {number} data - * @param {Object} [opt] - * @param {number|string} [opt.precision] If 'auto', use nice presision. - * @param {boolean} [opt.pad] returns 1.50 but not 1.5 if precision is 2. - * @return {string} + * @param opt.precision If 'auto', use nice presision. + * @param opt.pad returns 1.50 but not 1.5 if precision is 2. */ - getLabel: function (data, opt) { + getLabel( + data: number, + opt?: { + precision?: 'auto' | number, + pad?: boolean + } + ): string { if (data == null) { return ''; } @@ -195,19 +179,15 @@ var IntervalScale = Scale.extend({ // (1) If `precision` is set, 12.005 should be display as '12.00500'. // (2) Use roundNumber (toFixed) to avoid scientific notation like '3.5e-7'. - data = roundNumber(data, precision, true); + var dataNum = roundNumber(data, precision as number, true); - return formatUtil.addCommas(data); - }, + return formatUtil.addCommas(dataNum); + } /** - * Update interval and extent of intervals for nice ticks - * - * @param {number} [splitNumber = 5] Desired number of ticks - * @param {number} [minInterval] - * @param {number} [maxInterval] + * @param splitNumber By default `5`. */ - niceTicks: function (splitNumber, minInterval, maxInterval) { + niceTicks(splitNumber?: number, minInterval?: number, maxInterval?: number): void { splitNumber = splitNumber || 5; var extent = this._extent; var span = extent[1] - extent[0]; @@ -228,18 +208,15 @@ var IntervalScale = Scale.extend({ this._intervalPrecision = result.intervalPrecision; this._interval = result.interval; this._niceExtent = result.niceTickExtent; - }, + } - /** - * Nice extent. - * @param {Object} opt - * @param {number} [opt.splitNumber = 5] Given approx tick number - * @param {boolean} [opt.fixMin=false] - * @param {boolean} [opt.fixMax=false] - * @param {boolean} [opt.minInterval] - * @param {boolean} [opt.maxInterval] - */ - niceExtent: function (opt) { + niceExtent(opt: { + splitNumber: number, // By default 5. + fixMin?: boolean, + fixMax?: boolean, + minInterval?: number, + maxInterval?: number + }): void { var extent = this._extent; // If extent start and end are same, expand them if (extent[0] === extent[1]) { @@ -282,13 +259,9 @@ var IntervalScale = Scale.extend({ extent[1] = roundNumber(Math.ceil(extent[1] / interval) * interval); } } -}); -/** - * @return {module:echarts/scale/Time} - */ -IntervalScale.create = function () { - return new IntervalScale(); -}; +} + +Scale.registerClass(IntervalScale); -export default IntervalScale; \ No newline at end of file +export default IntervalScale; diff --git a/src/scale/Log.ts b/src/scale/Log.ts index 9f28d3c..4349f36 100644 --- a/src/scale/Log.ts +++ b/src/scale/Log.ts @@ -17,21 +17,17 @@ * under the License. */ -// @ts-nocheck - -/** - * Log scale - * @module echarts/scale/Log - */ - import * as zrUtil from 'zrender/src/core/util'; import Scale from './Scale'; import * as numberUtil from '../util/number'; // Use some method of IntervalScale import IntervalScale from './Interval'; +import List from '../data/List'; +import { DimensionName } from '../util/types'; var scaleProto = Scale.prototype; +// FIXME:TS refactor: not good to call it directly with `this`? var intervalScaleProto = IntervalScale.prototype; var getPrecisionSafe = numberUtil.getPrecisionSafe; @@ -43,77 +39,63 @@ var mathPow = Math.pow; var mathLog = Math.log; -var LogScale = Scale.extend({ +class LogScale extends Scale { + + static type = 'log'; - type: 'log', + private base = 10; - base: 10, + private _originalScale: IntervalScale = new IntervalScale(); - $constructor: function () { - Scale.apply(this, arguments); - this._originalScale = new IntervalScale(); - }, + private _fixMin: boolean; + private _fixMax: boolean; + + // FIXME:TS actually used by `IntervalScale` + private _interval: number = 0; + // FIXME:TS actually used by `IntervalScale` + private _niceExtent: [number, number]; /** - * @param {boolean} [expandToNicedExtent=false] If expand the ticks to niced extent. - * @return {Array.<number>} + * @param Whether expand the ticks to niced extent. */ - getTicks: function (expandToNicedExtent) { + getTicks(expandToNicedExtent: boolean): number[] { var originalScale = this._originalScale; var extent = this._extent; var originalExtent = originalScale.getExtent(); - return zrUtil.map(intervalScaleProto.getTicks.call(this, expandToNicedExtent), function (val) { + var ticks = intervalScaleProto.getTicks.call(this, expandToNicedExtent); + + return zrUtil.map(ticks, function (val) { var powVal = numberUtil.round(mathPow(this.base, val)); // Fix #4158 - powVal = (val === extent[0] && originalScale.__fixMin) + powVal = (val === extent[0] && this._fixMin) ? fixRoundingError(powVal, originalExtent[0]) : powVal; - powVal = (val === extent[1] && originalScale.__fixMax) + powVal = (val === extent[1] && this._fixMax) ? fixRoundingError(powVal, originalExtent[1]) : powVal; return powVal; }, this); - }, - - /** - * @param {number} splitNumber - * @return {Array.<Array.<number>>} - */ - getMinorTicks: intervalScaleProto.getMinorTicks, - - /** - * @param {number} val - * @return {string} - */ - getLabel: intervalScaleProto.getLabel, + } - /** - * @param {number} val - * @return {number} - */ - scale: function (val) { - val = scaleProto.scale.call(this, val); + scale(val: number): number { + val = super.scale(val); return mathPow(this.base, val); - }, + } - /** - * @param {number} start - * @param {number} end - */ - setExtent: function (start, end) { + setExtent(start: number, end: number): void { var base = this.base; start = mathLog(start) / mathLog(base); end = mathLog(end) / mathLog(base); intervalScaleProto.setExtent.call(this, start, end); - }, + } /** * @return {number} end */ - getExtent: function () { + getExtent() { var base = this.base; var extent = scaleProto.getExtent.call(this); extent[0] = mathPow(base, extent[0]); @@ -122,38 +104,32 @@ var LogScale = Scale.extend({ // Fix #4158 var originalScale = this._originalScale; var originalExtent = originalScale.getExtent(); - originalScale.__fixMin && (extent[0] = fixRoundingError(extent[0], originalExtent[0])); - originalScale.__fixMax && (extent[1] = fixRoundingError(extent[1], originalExtent[1])); + this._fixMin && (extent[0] = fixRoundingError(extent[0], originalExtent[0])); + this._fixMax && (extent[1] = fixRoundingError(extent[1], originalExtent[1])); return extent; - }, + } - /** - * @param {Array.<number>} extent - */ - unionExtent: function (extent) { + unionExtent(extent: [number, number]): void { this._originalScale.unionExtent(extent); var base = this.base; extent[0] = mathLog(extent[0]) / mathLog(base); extent[1] = mathLog(extent[1]) / mathLog(base); scaleProto.unionExtent.call(this, extent); - }, + } - /** - * @override - */ - unionExtentFromData: function (data, dim) { + unionExtentFromData(data: List, dim: DimensionName): void { // TODO // filter value that <= 0 this.unionExtent(data.getApproximateExtent(dim)); - }, + } /** * Update interval and extent of intervals for nice ticks - * @param {number} [approxTickNum = 10] Given approx tick number + * @param approxTickNum default 10 Given approx tick number */ - niceTicks: function (approxTickNum) { + niceTicks(approxTickNum: number): void { approxTickNum = approxTickNum || 10; var extent = this._extent; var span = extent[1] - extent[0]; @@ -177,39 +153,46 @@ var LogScale = Scale.extend({ var niceExtent = [ numberUtil.round(mathCeil(extent[0] / interval) * interval), numberUtil.round(mathFloor(extent[1] / interval) * interval) - ]; + ] as [number, number]; this._interval = interval; this._niceExtent = niceExtent; - }, + } - /** - * Nice extent. - * @override - */ - niceExtent: function (opt) { + niceExtent(opt: { + splitNumber: number, // By default 5. + fixMin?: boolean, + fixMax?: boolean, + minInterval?: number, + maxInterval?: number + }): void { intervalScaleProto.niceExtent.call(this, opt); - var originalScale = this._originalScale; - originalScale.__fixMin = opt.fixMin; - originalScale.__fixMax = opt.fixMax; + this._fixMin = opt.fixMin; + this._fixMax = opt.fixMax; } -}); + contain(val: number): boolean { + val = mathLog(val) / mathLog(this.base); + return super.contain(val); + } -zrUtil.each(['contain', 'normalize'], function (methodName) { - LogScale.prototype[methodName] = function (val) { + normalize(val: number): number { val = mathLog(val) / mathLog(this.base); - return scaleProto[methodName].call(this, val); - }; -}); + return super.normalize(val); + } + + getMinorTicks: IntervalScale['getMinorTicks']; + getLabel: IntervalScale['getLabel']; +} + +var proto = LogScale.prototype; +proto.getMinorTicks = intervalScaleProto.getMinorTicks; +proto.getLabel = intervalScaleProto.getLabel; -LogScale.create = function () { - return new LogScale(); -}; -function fixRoundingError(val, originalVal) { +function fixRoundingError(val: number, originalVal: number): number { return roundingErrorFix(val, getPrecisionSafe(originalVal)); } -export default LogScale; \ No newline at end of file +export default LogScale; diff --git a/src/scale/Ordinal.ts b/src/scale/Ordinal.ts index 4eae3db..05ee404 100644 --- a/src/scale/Ordinal.ts +++ b/src/scale/Ordinal.ts @@ -17,12 +17,8 @@ * under the License. */ -// @ts-nocheck - /** * Linear continuous scale - * @module echarts/coord/scale/Ordinal - * * http://en.wikipedia.org/wiki/Level_of_measurement */ @@ -31,56 +27,58 @@ import * as zrUtil from 'zrender/src/core/util'; import Scale from './Scale'; import OrdinalMeta from '../data/OrdinalMeta'; +import List from '../data/List'; +import { OrdinalRawValue, OrdinalNumber, DimensionLoose } from '../util/types'; -var scaleProto = Scale.prototype; -var OrdinalScale = Scale.extend({ +class OrdinalScale extends Scale { - type: 'ordinal', + static type: 'ordinal'; - /** - * @param {module:echarts/data/OrdianlMeta|Array.<string>} ordinalMeta - */ - init: function (ordinalMeta, extent) { + private _ordinalMeta: OrdinalMeta; + + + constructor(setting?: { + ordinalMeta?: OrdinalMeta | OrdinalRawValue[], + extent?: [number, number] + }) { + super(setting); + + var ordinalMeta = this.getSetting('ordinalMeta'); // Caution: Should not use instanceof, consider ec-extensions using // import approach to get OrdinalMeta class. if (!ordinalMeta || zrUtil.isArray(ordinalMeta)) { ordinalMeta = new OrdinalMeta({categories: ordinalMeta}); } this._ordinalMeta = ordinalMeta; - this._extent = extent || [0, ordinalMeta.categories.length - 1]; - }, + this._extent = this.getSetting('extent') || [0, ordinalMeta.categories.length - 1]; + } - parse: function (val) { + parse(val: OrdinalRawValue | OrdinalNumber): OrdinalNumber { return typeof val === 'string' ? this._ordinalMeta.getOrdinal(val) // val might be float. : Math.round(val); - }, + } - contain: function (rank) { + contain(rank: OrdinalRawValue | OrdinalNumber): boolean { rank = this.parse(rank); - return scaleProto.contain.call(this, rank) + return super.contain(rank) && this._ordinalMeta.categories[rank] != null; - }, + } /** * Normalize given rank or name to linear [0, 1] - * @param {number|string} [val] - * @return {number} */ - normalize: function (val) { - return scaleProto.normalize.call(this, this.parse(val)); - }, + normalize(val: OrdinalRawValue | OrdinalNumber): number { + return super.normalize(this.parse(val)); + } - scale: function (val) { - return Math.round(scaleProto.scale.call(this, val)); - }, + scale(val: number): OrdinalNumber { + return Math.round(super.scale(val)); + } - /** - * @return {Array} - */ - getTicks: function () { + getTicks(): OrdinalNumber[] { var ticks = []; var extent = this._extent; var rank = extent[0]; @@ -91,47 +89,41 @@ var OrdinalScale = Scale.extend({ } return ticks; - }, + } + + getMinorTicks(splitNumber: number): number[][] { + // Not support. + return; + } /** * Get item on rank n - * @param {number} n - * @return {string} */ - getLabel: function (n) { + getLabel(n: OrdinalNumber): string { if (!this.isBlank()) { // Note that if no data, ordinalMeta.categories is an empty array. - return this._ordinalMeta.categories[n]; + return this._ordinalMeta.categories[n] + ''; } - }, + } - /** - * @return {number} - */ - count: function () { + count(): number { return this._extent[1] - this._extent[0] + 1; - }, + } - /** - * @override - */ - unionExtentFromData: function (data, dim) { + unionExtentFromData(data: List, dim: DimensionLoose) { this.unionExtent(data.getApproximateExtent(dim)); - }, + } - getOrdinalMeta: function () { + getOrdinalMeta(): OrdinalMeta { return this._ordinalMeta; - }, + } - niceTicks: zrUtil.noop, - niceExtent: zrUtil.noop -}); + niceTicks() {} -/** - * @return {module:echarts/scale/Time} - */ -OrdinalScale.create = function () { - return new OrdinalScale(); -}; + niceExtent() {} + +} + +Scale.registerClass(OrdinalScale); -export default OrdinalScale; \ No newline at end of file +export default OrdinalScale; diff --git a/src/scale/Scale.ts b/src/scale/Scale.ts index 5203002..a58c26f 100644 --- a/src/scale/Scale.ts +++ b/src/scale/Scale.ts @@ -17,153 +17,160 @@ * under the License. */ -// @ts-nocheck - -/** - * // Scale class management - * @module echarts/scale/Scale - */ import * as clazzUtil from '../util/clazz'; +import { Dictionary } from 'zrender/src/core/types'; +import List from '../data/List'; +import { DimensionName } from '../util/types'; + + +abstract class Scale { + + private _setting: Dictionary<any>; -/** - * @param {Object} [setting] - */ -function Scale(setting) { - this._setting = setting || {}; + protected _extent: [number, number]; + + private _isBlank: boolean; + + constructor(setting?: Dictionary<any>) { + this._setting = setting || {}; + this._extent = [Infinity, -Infinity]; + } /** - * Extent - * @type {Array.<number>} - * @protected + * Parse input val to valid inner number. */ - this._extent = [Infinity, -Infinity]; + parse(val: any): any { + // Notice: This would be a trap here, If the implementation + // of this method depends on extent, and this method is used + // before extent set (like in dataZoom), it would be wrong. + // Nevertheless, parse does not depend on extent generally. + return val; + } + + getSetting(name: string): any { + return this._setting[name]; + } + + contain(val: number): boolean { + var extent = this._extent; + return val >= extent[0] && val <= extent[1]; + } /** - * Step is calculated in adjustExtent - * @type {Array.<number>} - * @protected + * Normalize value to linear [0, 1], return 0.5 if extent span is 0 */ - this._interval = 0; + normalize(val: number): number { + var extent = this._extent; + if (extent[1] === extent[0]) { + return 0.5; + } + return (val - extent[0]) / (extent[1] - extent[0]); + } - this.init && this.init.apply(this, arguments); -} + /** + * Scale normalized value + */ + scale(val: number): number { + var extent = this._extent; + return val * (extent[1] - extent[0]) + extent[0]; + } -/** - * Parse input val to valid inner number. - * @param {*} val - * @return {number} - */ -Scale.prototype.parse = function (val) { - // Notice: This would be a trap here, If the implementation - // of this method depends on extent, and this method is used - // before extent set (like in dataZoom), it would be wrong. - // Nevertheless, parse does not depend on extent generally. - return val; -}; - -Scale.prototype.getSetting = function (name) { - return this._setting[name]; -}; - -Scale.prototype.contain = function (val) { - var extent = this._extent; - return val >= extent[0] && val <= extent[1]; -}; - -/** - * Normalize value to linear [0, 1], return 0.5 if extent span is 0 - * @param {number} val - * @return {number} - */ -Scale.prototype.normalize = function (val) { - var extent = this._extent; - if (extent[1] === extent[0]) { - return 0.5; + /** + * Set extent from data + */ + unionExtent(other: [number, number]): void { + var extent = this._extent; + other[0] < extent[0] && (extent[0] = other[0]); + other[1] > extent[1] && (extent[1] = other[1]); + // not setExtent because in log axis it may transformed to power + // this.setExtent(extent[0], extent[1]); } - return (val - extent[0]) / (extent[1] - extent[0]); -}; - -/** - * Scale normalized value - * @param {number} val - * @return {number} - */ -Scale.prototype.scale = function (val) { - var extent = this._extent; - return val * (extent[1] - extent[0]) + extent[0]; -}; - -/** - * Set extent from data - * @param {Array.<number>} other - */ -Scale.prototype.unionExtent = function (other) { - var extent = this._extent; - other[0] < extent[0] && (extent[0] = other[0]); - other[1] > extent[1] && (extent[1] = other[1]); - // not setExtent because in log axis it may transformed to power - // this.setExtent(extent[0], extent[1]); -}; - -/** - * Set extent from data - * @param {module:echarts/data/List} data - * @param {string} dim - */ -Scale.prototype.unionExtentFromData = function (data, dim) { - this.unionExtent(data.getApproximateExtent(dim)); -}; - -/** - * Get extent - * @return {Array.<number>} - */ -Scale.prototype.getExtent = function () { - return this._extent.slice(); -}; - -/** - * Set extent - * @param {number} start - * @param {number} end - */ -Scale.prototype.setExtent = function (start, end) { - var thisExtent = this._extent; - if (!isNaN(start)) { - thisExtent[0] = start; + + /** + * Set extent from data + */ + unionExtentFromData(data: List, dim: DimensionName): void { + this.unionExtent(data.getApproximateExtent(dim)); } - if (!isNaN(end)) { - thisExtent[1] = end; + + /** + * Get extent + */ + getExtent(): [number, number] { + return this._extent.slice() as [number, number]; } -}; - -/** - * When axis extent depends on data and no data exists, - * axis ticks should not be drawn, which is named 'blank'. - */ -Scale.prototype.isBlank = function () { - return this._isBlank; -}, - -/** - * When axis extent depends on data and no data exists, - * axis ticks should not be drawn, which is named 'blank'. - */ -Scale.prototype.setBlank = function (isBlank) { - this._isBlank = isBlank; -}; - -/** - * @abstract - * @param {*} tick - * @return {string} label of the tick. - */ -Scale.prototype.getLabel = null; - - -clazzUtil.enableClassExtend(Scale); -clazzUtil.enableClassManagement(Scale, { + + /** + * Set extent + */ + setExtent(start: number, end: number): void { + var thisExtent = this._extent; + if (!isNaN(start)) { + thisExtent[0] = start; + } + if (!isNaN(end)) { + thisExtent[1] = end; + } + } + + /** + * When axis extent depends on data and no data exists, + * axis ticks should not be drawn, which is named 'blank'. + */ + isBlank(): boolean { + return this._isBlank; + } + + /** + * When axis extent depends on data and no data exists, + * axis ticks should not be drawn, which is named 'blank'. + */ + setBlank(isBlank: boolean) { + this._isBlank = isBlank; + } + + /** + * Update interval and extent of intervals for nice ticks + * + * @param splitNumber Approximated tick numbers. Optional. + * The implementation of `niceTicks` should decide tick numbers + * whether `splitNumber` is given. + * @param minInterval Optional. + * @param maxInterval Optional. + */ + abstract niceTicks( + // FIXME:TS make them in a "opt", the same with `niceExtent`? + splitNumber?: number, + minInterval?: number, + maxInterval?: number + ): void; + + abstract niceExtent( + opt?: { + splitNumber?: number, + fixMin?: boolean, + fixMax?: boolean, + minInterval?: number, + maxInterval?: number + } + ): void; + + /** + * @return label of the tick. + */ + abstract getLabel(tick: any): string; + + abstract getTicks(expandToNicedExtent: boolean): number[]; + + abstract getMinorTicks(splitNumber: number): number[][]; + + static registerClass: clazzUtil.ClassManager['registerClass']; + +} + +type ScaleConstructor = typeof Scale & clazzUtil.ClassManager; +clazzUtil.enableClassManagement(Scale as ScaleConstructor, { registerWhenExtend: true }); diff --git a/src/scale/Time.ts b/src/scale/Time.ts index 11aaa52..8709c57 100644 --- a/src/scale/Time.ts +++ b/src/scale/Time.ts @@ -17,8 +17,6 @@ * under the License. */ -// @ts-nocheck - /* * A third-party license is embeded for some of the code in this file: * The "scaleLevels" was originally copied from "d3.js" with some @@ -40,13 +38,12 @@ // (2) By default, the input data string (e.g., '2011-01-02') should be displayed // as its original time, without any time difference. -import * as zrUtil from 'zrender/src/core/util'; import * as numberUtil from '../util/number'; import * as formatUtil from '../util/format'; import * as scaleHelper from './helper'; import IntervalScale from './Interval'; +import Model from '../model/Model'; -var intervalScaleProto = IntervalScale.prototype; var mathCeil = Math.ceil; var mathFloor = Math.floor; @@ -56,7 +53,12 @@ var ONE_HOUR = ONE_MINUTE * 60; var ONE_DAY = ONE_HOUR * 24; // FIXME 公用? -var bisect = function (a, x, lo, hi) { +var bisect = function ( + a: [string, number][], + x: number, + lo: number, + hi: number +): number { while (lo < hi) { var mid = lo + hi >>> 1; if (a[mid][1] < x) { @@ -69,28 +71,30 @@ var bisect = function (a, x, lo, hi) { return lo; }; -/** - * @alias module:echarts/coord/scale/Time - * @constructor - */ -var TimeScale = IntervalScale.extend({ - type: 'time', - /** - * @override - */ - getLabel: function (val) { +class TimeScale extends IntervalScale { + + static type = 'time'; + + private _stepLvl: [string, number]; + + getLabel(val: number): string { var stepLvl = this._stepLvl; var date = new Date(val); return formatUtil.formatTime(stepLvl[0], date, this.getSetting('useUTC')); - }, + } - /** - * @override - */ - niceExtent: function (opt) { + niceExtent( + opt?: { + splitNumber?: number, + fixMin?: boolean, + fixMax?: boolean, + minInterval?: number, + maxInterval?: number + } + ): void { var extent = this._extent; // If extent start and end are same, expand them if (extent[0] === extent[1]) { @@ -116,12 +120,9 @@ var TimeScale = IntervalScale.extend({ if (!opt.fixMax) { extent[1] = numberUtil.round(mathCeil(extent[1] / interval) * interval); } - }, + } - /** - * @override - */ - niceTicks: function (approxTickNum, minInterval, maxInterval) { + niceTicks(approxTickNum: number, minInterval: number, maxInterval: number): void { approxTickNum = approxTickNum || 10; var extent = this._extent; @@ -156,7 +157,7 @@ var TimeScale = IntervalScale.extend({ var niceExtent = [ Math.round(mathCeil((extent[0] - timezoneOffset) / interval) * interval + timezoneOffset), Math.round(mathFloor((extent[1] - timezoneOffset) / interval) * interval + timezoneOffset) - ]; + ] as [number, number]; scaleHelper.fixExtent(niceExtent, extent); @@ -164,19 +165,23 @@ var TimeScale = IntervalScale.extend({ // Interval will be used in getTicks this._interval = interval; this._niceExtent = niceExtent; - }, + } - parse: function (val) { + parse(val: any): number { // val might be float. return +numberUtil.parseDate(val); } -}); -zrUtil.each(['contain', 'normalize'], function (methodName) { - TimeScale.prototype[methodName] = function (val) { - return intervalScaleProto[methodName].call(this, this.parse(val)); - }; -}); + contain(val: number): boolean { + return super.contain(this.parse(val)); + } + + normalize(val: number): number { + return super.normalize(this.parse(val)); + } + +} + /** * This implementation was originally copied from "d3.js" @@ -221,14 +226,7 @@ var scaleLevels = [ ['month', ONE_DAY * 31 * 8], // 8M ['month', ONE_DAY * 31 * 10], // 10M ['year', ONE_DAY * 380] // 1Y -]; +] as [string, number][]; -/** - * @param {module:echarts/model/Model} - * @return {module:echarts/scale/Time} - */ -TimeScale.create = function (model) { - return new TimeScale({useUTC: model.ecModel.get('useUTC')}); -}; -export default TimeScale; \ No newline at end of file +export default TimeScale; diff --git a/src/scale/helper.ts b/src/scale/helper.ts index bd8be72..3af512c 100644 --- a/src/scale/helper.ts +++ b/src/scale/helper.ts @@ -17,28 +17,30 @@ * under the License. */ -// @ts-nocheck - -/** - * For testable. - */ - import * as numberUtil from '../util/number'; var roundNumber = numberUtil.round; +type intervalScaleNiceTicksResult = { + interval: number, + intervalPrecision: number, + niceTickExtent: [number, number] +}; /** - * @param {Array.<number>} extent Both extent[0] and extent[1] should be valid number. - * Should be extent[0] < extent[1]. - * @param {number} splitNumber splitNumber should be >= 1. - * @param {number} [minInterval] - * @param {number} [maxInterval] - * @return {Object} {interval, intervalPrecision, niceTickExtent} + * @param extent Both extent[0] and extent[1] should be valid number. + * Should be extent[0] < extent[1]. + * @param splitNumber splitNumber should be >= 1. */ -export function intervalScaleNiceTicks(extent, splitNumber, minInterval, maxInterval) { - var result = {}; - var span = extent[1] - extent[0]; +export function intervalScaleNiceTicks( + extent: [number, number], + splitNumber: number, + minInterval?: number, + maxInterval?: number +): intervalScaleNiceTicksResult { + + var result = {} as intervalScaleNiceTicksResult; + var span = extent[1] - extent[0]; var interval = result.interval = numberUtil.nice(span / splitNumber, true); if (minInterval != null && interval < minInterval) { interval = result.interval = minInterval; @@ -60,20 +62,23 @@ export function intervalScaleNiceTicks(extent, splitNumber, minInterval, maxInte } /** - * @param {number} interval - * @return {number} interval precision + * @return interval precision */ -export function getIntervalPrecision(interval) { +export function getIntervalPrecision(interval: number): number { // Tow more digital for tick. return numberUtil.getPrecisionSafe(interval) + 2; } -function clamp(niceTickExtent, idx, extent) { +function clamp( + niceTickExtent: [number, number], idx: number, extent: [number, number] +): void { niceTickExtent[idx] = Math.max(Math.min(niceTickExtent[idx], extent[1]), extent[0]); } // In some cases (e.g., splitNumber is 1), niceTickExtent may be out of extent. -export function fixExtent(niceTickExtent, extent) { +export function fixExtent( + niceTickExtent: [number, number], extent: [number, number] +): void { !isFinite(niceTickExtent[0]) && (niceTickExtent[0] = extent[0]); !isFinite(niceTickExtent[1]) && (niceTickExtent[1] = extent[1]); clamp(niceTickExtent, 0, extent); @@ -81,4 +86,4 @@ export function fixExtent(niceTickExtent, extent) { if (niceTickExtent[0] > niceTickExtent[1]) { niceTickExtent[0] = niceTickExtent[1]; } -} \ No newline at end of file +} diff --git a/src/util/format.ts b/src/util/format.ts index 54b630c..fc1548d 100644 --- a/src/util/format.ts +++ b/src/util/format.ts @@ -196,7 +196,7 @@ function pad(str: string, len: number): string { * and `module:echarts/util/number#parseDate`. * @inner */ -export function formatTime(tpl: string, value: number, isUTC?: boolean) { +export function formatTime(tpl: string, value: number | string | Date, isUTC?: boolean) { if (tpl === 'week' || tpl === 'month' || tpl === 'quarter' diff --git a/src/util/number.ts b/src/util/number.ts index ca6ee67..1a9d0ba 100644 --- a/src/util/number.ts +++ b/src/util/number.ts @@ -125,14 +125,17 @@ export function parsePercent(percent: number | string, all: number): number { * (1) Fix rounding error of float numbers. * (2) Support return string to avoid scientific notation like '3.5e-7'. */ -export function round(x: number | string, precision: number, returnStr?: boolean): string | number { +export function round(x: number | string, precision?: number): number; +export function round(x: number | string, precision: number, returnStr: false): number; +export function round(x: number | string, precision: number, returnStr: true): string; +export function round(x: number | string, precision?: number, returnStr?: boolean): string | number { if (precision == null) { precision = 10; } // Avoid range error precision = Math.min(Math.max(0, precision), 20); x = (+x).toFixed(precision); - return returnStr ? x : +x; + return (returnStr ? x : +x); } /** diff --git a/src/util/types.ts b/src/util/types.ts index 53509a3..6e7bb35 100644 --- a/src/util/types.ts +++ b/src/util/types.ts @@ -61,7 +61,9 @@ export type ZRFontWeight = 'normal' | 'bold' | 'bolder' | 'lighter' | number export type ZREasing = easingType -// Actually ComponentFullType is ComponentMainType.ComponentSubType +// ComponentFullType can be: +// 'xxx.yyy': means ComponentMainType.ComponentSubType. +// 'xxx': means ComponentMainType. // See `checkClassType` check the restict definition. export type ComponentFullType = string; export type ComponentMainType = keyof ECUnitOption & string; @@ -221,9 +223,9 @@ export type TooltipRenderMode = 'html' | 'richText'; // Ordinal/category data will be parsed to its index if possible, otherwise // keep its original string in list._storage. // Check `convertDataValue` for more details. -export type OrdinalRawValue = string; -export type OrdinalRawValueIndex = number; -export type ParsedDataNumeric = number | OrdinalRawValueIndex; +export type OrdinalRawValue = string | number; +export type OrdinalNumber = number; // The number mapped from each OrdinalRawValue. +export type ParsedDataNumeric = number | OrdinalNumber; export type ParsedDataValue = ParsedDataNumeric | OrdinalRawValue; export type AxisValue = ParsedDataNumeric; diff --git a/test/build/test-transform.js b/test/build/test-transform.js index 2eaa334..55e0396 100644 --- a/test/build/test-transform.js +++ b/test/build/test-transform.js @@ -22,7 +22,7 @@ const path = require('path'); const babel = require('@babel/core'); const fs = require('fs'); // See require('@babel/plugin-transform-modules-commonjs') -const esm2cjsPlugin = path.resolve(__dirname, '../../build/babel-plugin-transform-modules-commonjs-ec'); +// const esm2cjsPlugin = path.resolve(__dirname, '../../build/babel-plugin-transform-modules-commonjs-ec'); const removeDEVPlugin = path.resolve(__dirname, '../../build/babel-plugin-transform-remove-dev'); function run() { @@ -69,7 +69,8 @@ function esm2cjs() { function transformSingle() { let result = babel.transformFileSync(filePath, { - plugins: [removeDEVPlugin, esm2cjsPlugin] + // plugins: [removeDEVPlugin, esm2cjsPlugin] + plugins: [removeDEVPlugin] }); suite.writeToExpectFile(fileName, result.code); --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
