You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@echarts.apache.org by sh...@apache.org on 2020/02/19 12:11:48 UTC

[incubator-echarts] branch typescript updated (69ad6bf -> ca899c9)

This is an automated email from the ASF dual-hosted git repository.

shenyi pushed a change to branch typescript
in repository https://gitbox.apache.org/repos/asf/incubator-echarts.git.


    from 69ad6bf  refact: Model#option can only be object. rename StageHandler
     new bfa6649  fix: rollback previous commit about Model only support object becuase of performance drops
     new ca899c9  ts: add more types, pie, part of processor, visual

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 src/.eslintrc.yaml           |  2 +-
 src/chart/pie.ts             |  4 +--
 src/chart/pie/PieSeries.ts   |  2 +-
 src/chart/pie/labelLayout.ts | 78 ++++++++++++++++++++++++++++++++++++--------
 src/chart/pie/pieLayout.ts   | 23 ++++++++-----
 src/data/List.ts             |  4 ---
 src/echarts.ts               |  2 +-
 src/model/Component.ts       | 17 ++++++++--
 src/model/Global.ts          |  4 +--
 src/model/Model.ts           | 60 ++++++++++++++++++++--------------
 src/model/Series.ts          |  4 +--
 src/model/mixin/boxLayout.ts | 33 -------------------
 src/model/mixin/itemStyle.ts |  8 ++---
 src/model/mixin/textStyle.ts | 28 ++++++++--------
 src/processor/dataFilter.ts  |  7 ++--
 src/processor/dataSample.ts  | 10 ++++--
 src/stream/Scheduler.ts      | 34 +++++++++----------
 src/util/layout.ts           |  2 +-
 src/util/model.ts            |  2 +-
 src/util/types.ts            | 15 +++++----
 src/visual/dataColor.ts      | 20 +++++++-----
 src/visual/seriesColor.ts    |  4 ++-
 22 files changed, 211 insertions(+), 152 deletions(-)
 delete mode 100644 src/model/mixin/boxLayout.ts


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@echarts.apache.org
For additional commands, e-mail: commits-help@echarts.apache.org


[incubator-echarts] 02/02: ts: add more types, pie, part of processor, visual

Posted by sh...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

shenyi pushed a commit to branch typescript
in repository https://gitbox.apache.org/repos/asf/incubator-echarts.git

commit ca899c9eb831874681f26c879f12041fbae912bc
Author: pissang <bm...@gmail.com>
AuthorDate: Wed Feb 19 20:11:10 2020 +0800

    ts: add more types, pie, part of processor, visual
---
 src/.eslintrc.yaml           |  2 +-
 src/chart/pie.ts             |  4 +--
 src/chart/pie/PieSeries.ts   |  2 +-
 src/chart/pie/labelLayout.ts | 78 ++++++++++++++++++++++++++++++++++++--------
 src/chart/pie/pieLayout.ts   | 23 ++++++++-----
 src/echarts.ts               |  2 +-
 src/model/Component.ts       | 17 ++++++++--
 src/model/Global.ts          |  4 +--
 src/model/Model.ts           | 45 +++++++++++++------------
 src/model/Series.ts          |  4 +--
 src/model/mixin/boxLayout.ts | 33 -------------------
 src/model/mixin/itemStyle.ts |  8 ++---
 src/model/mixin/textStyle.ts | 28 ++++++++--------
 src/processor/dataFilter.ts  |  7 ++--
 src/processor/dataSample.ts  | 10 ++++--
 src/stream/Scheduler.ts      | 34 +++++++++----------
 src/util/layout.ts           |  2 +-
 src/util/model.ts            |  2 +-
 src/util/types.ts            | 15 +++++----
 src/visual/dataColor.ts      | 20 +++++++-----
 src/visual/seriesColor.ts    |  4 ++-
 21 files changed, 199 insertions(+), 145 deletions(-)

diff --git a/src/.eslintrc.yaml b/src/.eslintrc.yaml
index bf1fd2c..39534cb 100644
--- a/src/.eslintrc.yaml
+++ b/src/.eslintrc.yaml
@@ -189,7 +189,7 @@ rules:
 
 
     "@typescript-eslint/no-unused-vars":
-        - 2
+        - 1
         -
             vars: "local"
             args: "none"
\ No newline at end of file
diff --git a/src/chart/pie.ts b/src/chart/pie.ts
index 33b0d2f..4f8630b 100644
--- a/src/chart/pie.ts
+++ b/src/chart/pie.ts
@@ -17,8 +17,6 @@
 * under the License.
 */
 
-// @ts-nocheck
-
 import * as echarts from '../echarts';
 import * as zrUtil from 'zrender/src/core/util';
 
@@ -44,6 +42,8 @@ createDataSelectAction('pie', [{
     method: 'unSelect'
 }]);
 
+// type PieLayoutParameters = Parameters<typeof pieLayout>;
+
 echarts.registerVisual(dataColor('pie'));
 echarts.registerLayout(zrUtil.curry(pieLayout, 'pie'));
 echarts.registerProcessor(dataFilter('pie'));
\ No newline at end of file
diff --git a/src/chart/pie/PieSeries.ts b/src/chart/pie/PieSeries.ts
index f8205b2..ab7992a 100644
--- a/src/chart/pie/PieSeries.ts
+++ b/src/chart/pie/PieSeries.ts
@@ -280,7 +280,7 @@ class PieSeries extends SeriesModel<PieSeriesOption> {
 }
 
 interface PieSeries extends DataSelectableMixin<PieSeriesOption> {}
-zrUtil.tsMixin(PieSeries, DataSelectableMixin);
+zrUtil.mixin(PieSeries, DataSelectableMixin);
 
 SeriesModel.registerClass(PieSeries);
 
diff --git a/src/chart/pie/labelLayout.ts b/src/chart/pie/labelLayout.ts
index 5a82abf..8c8c073 100644
--- a/src/chart/pie/labelLayout.ts
+++ b/src/chart/pie/labelLayout.ts
@@ -17,21 +17,55 @@
 * under the License.
 */
 
-// @ts-nocheck
-
 // FIXME emphasis label position is not same with normal label position
 
 import * as textContain from 'zrender/src/contain/text';
 import {parsePercent} from '../../util/number';
+import PieSeries, { PieSeriesOption } from './PieSeries';
+import { VectorArray } from 'zrender/src/core/vector';
+import { ZRAlign, ZRVerticalAlign } from '../../util/types';
+import { RectLike } from 'zrender/src/core/BoundingRect';
 
 var RADIAN = Math.PI / 180;
 
-function adjustSingleSide(list, cx, cy, r, dir, viewWidth, viewHeight, viewLeft, viewTop, farthestX) {
+interface LabelLayout {
+    x: number
+    y: number
+    position: PieSeriesOption['label']['position'],
+    height: number
+    len: number
+    len2: number
+    linePoints: VectorArray[]
+    textAlign: ZRAlign
+    verticalAlign: ZRVerticalAlign,
+    rotation: number,
+    inside: boolean,
+    labelDistance: number,
+    labelAlignTo: PieSeriesOption['label']['alignTo'],
+    labelMargin: number,
+    bleedMargin: PieSeriesOption['label']['bleedMargin'],
+    textRect: RectLike,
+    text: string,
+    font: string
+}
+
+function adjustSingleSide(
+    list: LabelLayout[],
+    cx: number,
+    cy: number,
+    r: number,
+    dir: -1 | 1,
+    viewWidth: number,
+    viewHeight: number,
+    viewLeft: number,
+    viewTop: number,
+    farthestX: number
+) {
     list.sort(function (a, b) {
         return a.y - b.y;
     });
 
-    function shiftDown(start, end, delta, dir) {
+    function shiftDown(start: number, end: number, delta: number, dir: number) {
         for (var j = start; j < end; j++) {
             if (list[j].y + delta > viewTop + viewHeight) {
                 break;
@@ -50,7 +84,7 @@ function adjustSingleSide(list, cx, cy, r, dir, viewWidth, viewHeight, viewLeft,
         shiftUp(end - 1, delta / 2);
     }
 
-    function shiftUp(end, delta) {
+    function shiftUp(end: number, delta: number) {
         for (var j = end; j >= 0; j--) {
             if (list[j].y - delta < viewTop) {
                 break;
@@ -65,7 +99,11 @@ function adjustSingleSide(list, cx, cy, r, dir, viewWidth, viewHeight, viewLeft,
         }
     }
 
-    function changeX(list, isDownList, cx, cy, r, dir) {
+    function changeX(
+        list: LabelLayout[], isDownList: boolean,
+        cx: number, cy: number, r: number,
+        dir: 1 | -1
+    ) {
         var lastDeltaX = dir > 0
             ? isDownList                // right-side
                 ? Number.MAX_VALUE      // down
@@ -135,7 +173,16 @@ function adjustSingleSide(list, cx, cy, r, dir, viewWidth, viewHeight, viewLeft,
     changeX(downList, true, cx, cy, r, dir);
 }
 
-function avoidOverlap(labelLayoutList, cx, cy, r, viewWidth, viewHeight, viewLeft, viewTop) {
+function avoidOverlap(
+    labelLayoutList: LabelLayout[],
+    cx: number,
+    cy: number,
+    r: number,
+    viewWidth: number,
+    viewHeight: number,
+    viewLeft: number,
+    viewTop: number
+) {
     var leftList = [];
     var rightList = [];
     var leftmostX = Number.MAX_VALUE;
@@ -218,14 +265,21 @@ function avoidOverlap(labelLayoutList, cx, cy, r, viewWidth, viewHeight, viewLef
     }
 }
 
-function isPositionCenter(layout) {
+function isPositionCenter(layout: LabelLayout) {
     // Not change x for center label
     return layout.position === 'center';
 }
 
-export default function (seriesModel, r, viewWidth, viewHeight, viewLeft, viewTop) {
+export default function (
+    seriesModel: PieSeries,
+    r: number,
+    viewWidth: number,
+    viewHeight: number,
+    viewLeft: number,
+    viewTop: number
+) {
     var data = seriesModel.getData();
-    var labelLayoutList = [];
+    var labelLayoutList: LabelLayout[] = [];
     var cx;
     var cy;
     var hasLabelRotate = false;
@@ -268,9 +322,7 @@ export default function (seriesModel, r, viewWidth, viewHeight, viewLeft, viewTo
 
         var text = seriesModel.getFormattedLabel(idx, 'normal')
                 || data.getName(idx);
-        var textRect = textContain.getBoundingRect(
-            text, font, textAlign, 'top'
-        );
+        var textRect = textContain.getBoundingRect(text, font, textAlign, 'top');
 
         var isLabelInside = labelPosition === 'inside' || labelPosition === 'inner';
         if (labelPosition === 'center') {
diff --git a/src/chart/pie/pieLayout.ts b/src/chart/pie/pieLayout.ts
index 1d42b85..a96306e 100644
--- a/src/chart/pie/pieLayout.ts
+++ b/src/chart/pie/pieLayout.ts
@@ -17,17 +17,18 @@
 * under the License.
 */
 
-// @ts-nocheck
-
 import {parsePercent, linearMap} from '../../util/number';
 import * as layout from '../../util/layout';
 import labelLayout from './labelLayout';
 import * as zrUtil from 'zrender/src/core/util';
+import GlobalModel from '../../model/Global';
+import ExtensionAPI from '../../ExtensionAPI';
+import PieSeries from './PieSeries';
 
 var PI2 = Math.PI * 2;
 var RADIAN = Math.PI / 180;
 
-function getViewRect(seriesModel, api) {
+function getViewRect(seriesModel: PieSeries, api: ExtensionAPI) {
     return layout.getLayoutRect(
         seriesModel.getBoxLayoutParams(), {
             width: api.getWidth(),
@@ -36,8 +37,12 @@ function getViewRect(seriesModel, api) {
     );
 }
 
-export default function (seriesType, ecModel, api, payload) {
-    ecModel.eachSeriesByType(seriesType, function (seriesModel) {
+export default function (
+    seriesType: 'pie',
+    ecModel: GlobalModel,
+    api: ExtensionAPI
+) {
+    ecModel.eachSeriesByType(seriesType, function (seriesModel: PieSeries) {
         var data = seriesModel.getData();
         var valueDim = data.mapDimension('value');
         var viewRect = getViewRect(seriesModel, api);
@@ -65,7 +70,7 @@ export default function (seriesType, ecModel, api, payload) {
         var minAngle = seriesModel.get('minAngle') * RADIAN;
 
         var validDataCount = 0;
-        data.each(valueDim, function (value) {
+        data.each(valueDim, function (value: number) {
             !isNaN(value) && validDataCount++;
         });
 
@@ -89,7 +94,7 @@ export default function (seriesType, ecModel, api, payload) {
         var currentAngle = startAngle;
         var dir = clockwise ? 1 : -1;
 
-        data.each(valueDim, function (value, idx) {
+        data.each(valueDim, function (value: number, idx: number) {
             var angle;
             if (isNaN(value)) {
                 data.setItemLayout(idx, {
@@ -150,7 +155,7 @@ export default function (seriesType, ecModel, api, payload) {
             // Constrained by minAngle
             if (restAngle <= 1e-3) {
                 var angle = PI2 / validDataCount;
-                data.each(valueDim, function (value, idx) {
+                data.each(valueDim, function (value: number, idx: number) {
                     if (!isNaN(value)) {
                         var layout = data.getItemLayout(idx);
                         layout.angle = angle;
@@ -162,7 +167,7 @@ export default function (seriesType, ecModel, api, payload) {
             else {
                 unitRadian = restAngle / valueSumLargerThanMinAngle;
                 currentAngle = startAngle;
-                data.each(valueDim, function (value, idx) {
+                data.each(valueDim, function (value: number, idx: number) {
                     if (!isNaN(value)) {
                         var layout = data.getItemLayout(idx);
                         var angle = layout.angle === minAngle
diff --git a/src/echarts.ts b/src/echarts.ts
index 4850a97..9996dea 100644
--- a/src/echarts.ts
+++ b/src/echarts.ts
@@ -1818,7 +1818,7 @@ var enableConnect: (chart: ECharts) => void;
 
 
 interface ECharts extends Eventful {}
-zrUtil.tsMixin(ECharts, Eventful);
+zrUtil.mixin(ECharts, Eventful);
 
 var echartsProto = ECharts.prototype;
 echartsProto.on = createRegisterEventWithLowercaseECharts('on');
diff --git a/src/model/Component.ts b/src/model/Component.ts
index afd1e98..339f5d7 100644
--- a/src/model/Component.ts
+++ b/src/model/Component.ts
@@ -31,7 +31,6 @@ import {
 } from '../util/clazz';
 import {makeInner} from '../util/model';
 import * as layout from '../util/layout';
-import boxLayoutMixin from './mixin/boxLayout';
 import { CoordinateSystem } from '../coord/CoordinateSystem';
 import GlobalModel from './Global';
 import {
@@ -272,6 +271,20 @@ class ComponentModel<Opt extends ComponentOption = ComponentOption> extends Mode
         });
     }
 
+
+    getBoxLayoutParams() {
+        // Consider itself having box layout configs.
+        const boxLayoutModel = this as Model<ComponentOption & BoxLayoutOptionMixin>;
+        return {
+            left: boxLayoutModel.get('left'),
+            top: boxLayoutModel.get('top'),
+            right: boxLayoutModel.get('right'),
+            bottom: boxLayoutModel.get('bottom'),
+            width: boxLayoutModel.get('width'),
+            height: boxLayoutModel.get('height')
+        };
+    }
+
     static registerClass: ClassManager['registerClass'];
 }
 
@@ -322,6 +335,4 @@ function getDependencies(componentType: string): string[] {
     return deps;
 }
 
-zrUtil.mixin(ComponentModel, boxLayoutMixin);
-
 export default ComponentModel;
diff --git a/src/model/Global.ts b/src/model/Global.ts
index 0ae4292..39edddc 100644
--- a/src/model/Global.ts
+++ b/src/model/Global.ts
@@ -34,7 +34,7 @@
 import {__DEV__} from '../config';
 import {
     each, filter, map, isArray, indexOf, isObject, isString,
-    createHashMap, assert, clone, merge, extend, tsMixin, HashMap
+    createHashMap, assert, clone, merge, extend, mixin, HashMap
 } from 'zrender/src/core/util';
 import * as modelUtil from '../util/model';
 import Model from './Model';
@@ -795,6 +795,6 @@ function filterBySubType(
 
 // @ts-ignore FIXME:GlobalOption
 interface GlobalModel extends ColorPaletteMixin {}
-tsMixin(GlobalModel, ColorPaletteMixin);
+mixin(GlobalModel, ColorPaletteMixin);
 
 export default GlobalModel;
diff --git a/src/model/Model.ts b/src/model/Model.ts
index 1925620..6f8480e 100644
--- a/src/model/Model.ts
+++ b/src/model/Model.ts
@@ -112,18 +112,18 @@ class Model<Opt extends ModelOption = ModelOption> {
         path: R, ignoreParent?: boolean
     ): Opt[R];
     get<R extends keyof Opt>(
-        path: [R], ignoreParent?: boolean
+        path: readonly [R], ignoreParent?: boolean
     ): Opt[R];
     get<R extends keyof Opt, S extends keyof Opt[R]>(
-        path: [R, S], ignoreParent?: boolean
+        path: readonly [R, S], ignoreParent?: boolean
     ): Opt[R][S];
     get<R extends keyof Opt, S extends keyof Opt[R], T extends keyof Opt[R][S]>(
-        path: [R, S, T], ignoreParent?: boolean
+        path: readonly [R, S, T], ignoreParent?: boolean
     ): Opt[R][S][T];
     // `path` can be 'xxx.yyy.zzz', so the return value type have to be `ModelOption`
     // TODO: TYPE strict key check?
     // get(path: string | string[], ignoreParent?: boolean): ModelOption;
-    get(path: string | string[], ignoreParent?: boolean): ModelOption {
+    get(path: string | readonly string[], ignoreParent?: boolean): ModelOption {
         if (path == null) {
             return this.option;
         }
@@ -151,29 +151,33 @@ class Model<Opt extends ModelOption = ModelOption> {
         return val;
     }
 
+    // TODO At most 3 depth?
     getModel<R extends keyof Opt>(
         path: R, parentModel?: Model
     ): Model<Opt[R]>;
     getModel<R extends keyof Opt>(
-        path: [R], parentModel?: Model
+        path: readonly [R], parentModel?: Model
     ): Model<Opt[R]>;
     getModel<R extends keyof Opt, S extends keyof Opt[R]>(
-        path: [R, S], parentModel?: Model
+        path: readonly [R, S], parentModel?: Model
     ): Model<Opt[R][S]>;
     getModel<R extends keyof Opt, S extends keyof Opt[R], T extends keyof Opt[R][S]>(
-        path: [R, S, T], parentModel?: Model
+        path: readonly [R, S, T], parentModel?: Model
     ): Model<Opt[R][S][T]>;
     // `path` can be 'xxx.yyy.zzz', so the return value type have to be `Model<ModelOption>`
     // getModel(path: string | string[], parentModel?: Model): Model;
-    getModel(path: string | string[], parentModel?: Model): Model<any> {
-        var obj = path == null
-            ? this.option
-            : doGet(this.option, path = this.parsePath(path));
+    // TODO 'xxx.yyy.zzz' is deprecated
+    getModel(path: string | readonly string[], parentModel?: Model): Model<any> {
+        var hasPath = path != null;
+        var pathFinal = hasPath ? this.parsePath(path) : null;
+        var obj = hasPath
+            ? doGet(this.option, pathFinal)
+            : this.option;
 
         var thisParentModel;
         parentModel = parentModel || (
-            (thisParentModel = getParent(this, path))
-                && thisParentModel.getModel(path as string)
+            (thisParentModel = getParent(this, pathFinal))
+                && thisParentModel.getModel(pathFinal as readonly [string])
         );
 
         return new Model(obj, parentModel, this.ecModel);
@@ -199,9 +203,9 @@ class Model<Opt extends ModelOption = ModelOption> {
     // }
 
     // If path is null/undefined, return null/undefined.
-    parsePath(path: string | string[]): string[] {
+    parsePath(path: string | readonly string[]): readonly string[] {
         if (typeof path === 'string') {
-            path = path.split('.');
+            return path.split('.');
         }
         return path;
     }
@@ -231,7 +235,7 @@ class Model<Opt extends ModelOption = ModelOption> {
 
 };
 
-function doGet(obj: ModelOption, pathArr: string[], parentModel?: Model<Dictionary<any>>) {
+function doGet(obj: ModelOption, pathArr: readonly string[], parentModel?: Model<Dictionary<any>>) {
     for (var i = 0; i < pathArr.length; i++) {
         // Ignore empty
         if (!pathArr[i]) {
@@ -251,7 +255,7 @@ function doGet(obj: ModelOption, pathArr: string[], parentModel?: Model<Dictiona
 }
 
 // `path` can be null/undefined
-function getParent(model: Model, path: string | string[]): Model {
+function getParent(model: Model, path: string | readonly string[]): Model {
     var getParentMethod = inner(model).getParent;
     return getParentMethod ? getParentMethod.call(model, path) : model.parentModel;
 }
@@ -264,11 +268,10 @@ type ModelConstructor = typeof Model
 enableClassExtend(Model as ModelConstructor);
 enableClassCheck(Model as ModelConstructor);
 
-interface Model extends LineStyleMixin, ItemStyleMixin {}
-
-zrUtil.tsMixin(Model, LineStyleMixin);
+interface Model extends LineStyleMixin, ItemStyleMixin, textStyleMixin {}
+mixin(Model, LineStyleMixin);
+mixin(Model, ItemStyleMixin);
 mixin(Model, areaStyleMixin);
 mixin(Model, textStyleMixin);
-zrUtil.tsMixin(Model, ItemStyleMixin);
 
 export default Model;
diff --git a/src/model/Series.ts b/src/model/Series.ts
index 608aa14..eeaaf21 100644
--- a/src/model/Series.ts
+++ b/src/model/Series.ts
@@ -553,8 +553,8 @@ class SeriesModel<Opt extends SeriesOption = SeriesOption> extends ComponentMode
 
 interface SeriesModel<Opt extends SeriesOption = SeriesOption>
     extends DataFormatMixin, ColorPaletteMixin<Opt>, DataHost {}
-zrUtil.tsMixin(SeriesModel, DataFormatMixin);
-zrUtil.tsMixin(SeriesModel, ColorPaletteMixin);
+zrUtil.mixin(SeriesModel, DataFormatMixin);
+zrUtil.mixin(SeriesModel, ColorPaletteMixin);
 
 export type SeriesModelConstructor = typeof SeriesModel & ExtendableConstructor;
 mountExtend(SeriesModel, ComponentModel as SeriesModelConstructor);
diff --git a/src/model/mixin/boxLayout.ts b/src/model/mixin/boxLayout.ts
deleted file mode 100644
index f012468..0000000
--- a/src/model/mixin/boxLayout.ts
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
-* Licensed to the Apache Software Foundation (ASF) under one
-* or more contributor license agreements.  See the NOTICE file
-* distributed with this work for additional information
-* regarding copyright ownership.  The ASF licenses this file
-* to you under the Apache License, Version 2.0 (the
-* "License"); you may not use this file except in compliance
-* with the License.  You may obtain a copy of the License at
-*
-*   http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing,
-* software distributed under the License is distributed on an
-* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-* KIND, either express or implied.  See the License for the
-* specific language governing permissions and limitations
-* under the License.
-*/
-
-// @ts-nocheck
-
-export default {
-    getBoxLayoutParams: function () {
-        return {
-            left: this.get('left'),
-            top: this.get('top'),
-            right: this.get('right'),
-            bottom: this.get('bottom'),
-            width: this.get('width'),
-            height: this.get('height')
-        };
-    }
-};
\ No newline at end of file
diff --git a/src/model/mixin/itemStyle.ts b/src/model/mixin/itemStyle.ts
index 3c84c26..ee31de2 100644
--- a/src/model/mixin/itemStyle.ts
+++ b/src/model/mixin/itemStyle.ts
@@ -19,7 +19,7 @@
 
 import makeStyleMapper from './makeStyleMapper';
 import Model from '../Model';
-import { StyleOption } from 'zrender/src/graphic/Style';
+import { StyleProps } from 'zrender/src/graphic/Style';
 
 const STYLE_LIST = [
     ['fill', 'color'],
@@ -37,13 +37,13 @@ var getItemStyle = makeStyleMapper(STYLE_LIST);
 
 interface ItemStyleMixin extends Pick<Model, 'get'> {}
 
-type ItemStyleOption = Pick<
-    StyleOption, typeof STYLE_LIST[number][0]
+type ItemStyleProps = Pick<
+    StyleProps, typeof STYLE_LIST[number][0]
 >
 
 class ItemStyleMixin {
 
-    getItemStyle(excludes?: string[], includes?: string[]): ItemStyleOption {
+    getItemStyle(excludes?: string[], includes?: string[]): ItemStyleProps {
         var style = getItemStyle(this, excludes, includes);
         var lineDash = this.getBorderLineDash();
         lineDash && ((style as any).lineDash = lineDash);
diff --git a/src/model/mixin/textStyle.ts b/src/model/mixin/textStyle.ts
index f0e021e..6235923 100644
--- a/src/model/mixin/textStyle.ts
+++ b/src/model/mixin/textStyle.ts
@@ -17,50 +17,52 @@
 * under the License.
 */
 
-// @ts-nocheck
-
 import * as textContain from 'zrender/src/contain/text';
 import * as graphicUtil from '../../util/graphic';
+import Model from '../Model';
+import { LabelOption } from '../../util/types';
 
-var PATH_COLOR = ['textStyle', 'color'];
+var PATH_COLOR = ['textStyle', 'color'] as const;
 
-export default {
+class TextStyleMixin {
     /**
      * Get color property or get color from option.textStyle.color
      * @param {boolean} [isEmphasis]
      * @return {string}
      */
-    getTextColor: function (isEmphasis) {
+    getTextColor(this: Model, isEmphasis?: boolean) {
         var ecModel = this.ecModel;
         return this.getShallow('color')
             || (
                 (!isEmphasis && ecModel) ? ecModel.get(PATH_COLOR) : null
             );
-    },
+    }
 
     /**
      * Create font string from fontStyle, fontWeight, fontSize, fontFamily
      * @return {string}
      */
-    getFont: function () {
+    getFont(this: Model<LabelOption>) {
         return graphicUtil.getFont({
             fontStyle: this.getShallow('fontStyle'),
             fontWeight: this.getShallow('fontWeight'),
             fontSize: this.getShallow('fontSize'),
             fontFamily: this.getShallow('fontFamily')
         }, this.ecModel);
-    },
+    }
 
-    getTextRect: function (text) {
+    getTextRect(this: Model<LabelOption> & TextStyleMixin, text: string) {
         return textContain.getBoundingRect(
             text,
             this.getFont(),
             this.getShallow('align'),
             this.getShallow('verticalAlign') || this.getShallow('baseline'),
-            this.getShallow('padding'),
+            this.getShallow('padding') as number[],
             this.getShallow('lineHeight'),
-            this.getShallow('rich'),
-            this.getShallow('truncateText')
+            this.getShallow('rich')
+            // this.getShallow('truncateText')
         );
     }
-};
\ No newline at end of file
+};
+
+export default TextStyleMixin;
\ No newline at end of file
diff --git a/src/processor/dataFilter.ts b/src/processor/dataFilter.ts
index 7ef78bf..fe09ea6 100644
--- a/src/processor/dataFilter.ts
+++ b/src/processor/dataFilter.ts
@@ -1,3 +1,5 @@
+import { StageHandler } from '../util/types';
+
 /*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
@@ -17,9 +19,7 @@
 * under the License.
 */
 
-// @ts-nocheck
-
-export default function (seriesType) {
+export default function (seriesType: string): StageHandler {
     return {
         seriesType: seriesType,
         reset: function (seriesModel, ecModel) {
@@ -34,6 +34,7 @@ export default function (seriesType) {
                 var name = data.getName(idx);
                 // If in any legend component the status is not selected.
                 for (var i = 0; i < legendModels.length; i++) {
+                    // @ts-ignore FIXME: LegendModel
                     if (!legendModels[i].isSelected(name)) {
                         return false;
                     }
diff --git a/src/processor/dataSample.ts b/src/processor/dataSample.ts
index 06c617f..9a28b80 100644
--- a/src/processor/dataSample.ts
+++ b/src/processor/dataSample.ts
@@ -19,8 +19,12 @@
 
 // @ts-nocheck
 
+import { StageHandler } from '../util/types';
+import { Dictionary } from 'zrender/src/core/types';
 
-var samplers = {
+
+type Sampler = (frame: ArrayLike<number>) => number;
+var samplers: Dictionary<Sampler> = {
     average: function (frame) {
         var sum = 0;
         var count = 0;
@@ -64,11 +68,11 @@ var samplers = {
     }
 };
 
-var indexSampler = function (frame, value) {
+var indexSampler = function (frame: ArrayLike<number>) {
     return Math.round(frame.length / 2);
 };
 
-export default function (seriesType) {
+export default function (seriesType: string): StageHandler {
     return {
 
         seriesType: seriesType,
diff --git a/src/stream/Scheduler.ts b/src/stream/Scheduler.ts
index 49b44fd..287447c 100644
--- a/src/stream/Scheduler.ts
+++ b/src/stream/Scheduler.ts
@@ -27,7 +27,7 @@ import GlobalModel from '../model/Global';
 import ExtensionAPI from '../ExtensionAPI';
 import {normalizeToArray} from '../util/model';
 import {
-    StageHandler, StageHandlerOverallReset, VisualType, StageHandlerInput,
+    StageHandlerInternal, StageHandlerOverallReset, VisualType, StageHandler,
     Payload, StageHandlerReset, StageHandlerPlan, StageHandlerProgressExecutor, LarginOptionMixin, SeriesOption
 } from '../util/types';
 import { EChartsType } from '../echarts';
@@ -108,9 +108,9 @@ class Scheduler {
     // this file and echarts.js
     unfinished: number;
 
-    private _dataProcessorHandlers: StageHandler[];
-    private _visualHandlers: StageHandler[];
-    private _allHandlers: StageHandler[];
+    private _dataProcessorHandlers: StageHandlerInternal[];
+    private _visualHandlers: StageHandlerInternal[];
+    private _allHandlers: StageHandlerInternal[];
 
     // key: handlerUID
     private _stageTaskMap: HashMap<TaskRecord> = createHashMap<TaskRecord>();
@@ -121,8 +121,8 @@ class Scheduler {
     constructor(
         ecInstance: EChartsType,
         api: ExtensionAPI,
-        dataProcessorHandlers: StageHandler[],
-        visualHandlers: StageHandler[]
+        dataProcessorHandlers: StageHandlerInternal[],
+        visualHandlers: StageHandlerInternal[]
     ) {
         this.ecInstance = ecInstance;
         this.api = api;
@@ -295,7 +295,7 @@ class Scheduler {
     }
 
     private _performStageTasks(
-        stageHandlers: StageHandler[],
+        stageHandlers: StageHandlerInternal[],
         ecModel: GlobalModel,
         payload: Payload,
         opt?: PerformStageTaskOpt
@@ -397,7 +397,7 @@ class Scheduler {
     }
 
     private _createSeriesStageTask(
-        stageHandler: StageHandler,
+        stageHandler: StageHandlerInternal,
         stageHandlerRecord: TaskRecord,
         ecModel: GlobalModel,
         api: ExtensionAPI
@@ -456,7 +456,7 @@ class Scheduler {
     }
 
     private _createOverallStageTask(
-        stageHandler: StageHandler,
+        stageHandler: StageHandlerInternal,
         stageHandlerRecord: TaskRecord,
         ecModel: GlobalModel,
         api: ExtensionAPI
@@ -549,20 +549,20 @@ class Scheduler {
     }
 
     static wrapStageHandler(
-        stageHandler: StageHandlerInput | StageHandlerOverallReset,
+        stageHandler: StageHandler | StageHandlerOverallReset,
         visualType: VisualType
-    ): StageHandler {
+    ): StageHandlerInternal {
         if (isFunction(stageHandler)) {
             stageHandler = {
                 overallReset: stageHandler,
                 seriesType: detectSeriseType(stageHandler)
-            } as StageHandler;
+            } as StageHandlerInternal;
         }
 
-        (stageHandler as StageHandler).uid = getUID('stageHandler');
-        visualType && ((stageHandler as StageHandler).visualType = visualType);
+        (stageHandler as StageHandlerInternal).uid = getUID('stageHandler');
+        visualType && ((stageHandler as StageHandlerInternal).visualType = visualType);
 
-        return stageHandler as StageHandler;
+        return stageHandler as StageHandlerInternal;
     };
 
 }
@@ -599,9 +599,9 @@ function seriesTaskReset(
     if (context.useClearVisual) {
         context.data.clearAllVisual();
     }
-    var resetDefines = context.resetDefines = normalizeToArray<StageHandlerProgressExecutor>(
+    var resetDefines = context.resetDefines = normalizeToArray(
         context.reset(context.model, context.ecModel, context.api, context.payload)
-    );
+    ) as StageHandlerProgressExecutor[];
     return resetDefines.length > 1
         ? map(resetDefines, function (v, idx) {
             return makeSeriesTaskProgress(idx);
diff --git a/src/util/layout.ts b/src/util/layout.ts
index 1faa010..870846d 100644
--- a/src/util/layout.ts
+++ b/src/util/layout.ts
@@ -196,7 +196,7 @@ export function getLayoutRect(
     positionInfo: BoxLayoutOptionMixin & {
         aspect?: number // aspect is width / height
     },
-    containerRect: RectLike,
+    containerRect: {width: number, height: number},
     margin?: number | number[]
 ): LayoutRect {
     margin = formatUtil.normalizeCssArray(margin || 0);
diff --git a/src/util/model.ts b/src/util/model.ts
index b0f45f3..3b45535 100644
--- a/src/util/model.ts
+++ b/src/util/model.ts
@@ -50,7 +50,7 @@ var DUMMY_COMPONENT_NAME_PREFIX = 'series\0';
  * @param  {*} value
  * @return {Array} [value] or value
  */
-export function normalizeToArray<T>(value: T | T[]): T[] {
+export function normalizeToArray<T>(value?: T | T[]): T[] {
     return value instanceof Array
         ? value
         : value == null
diff --git a/src/util/types.ts b/src/util/types.ts
index dc2fcc6..53509a3 100644
--- a/src/util/types.ts
+++ b/src/util/types.ts
@@ -161,6 +161,11 @@ export interface PostUpdater {
 
 export type VisualType = 'layout' | 'visual';
 
+
+export interface StageHandlerReset {
+    (seriesModel: SeriesModel, ecModel: GlobalModel, api: ExtensionAPI, payload?: Payload):
+        StageHandlerProgressExecutor | StageHandlerProgressExecutor[] | void
+}
 export interface StageHandlerOverallReset {
     (ecModel: GlobalModel, api: ExtensionAPI, payload?: Payload): void
 }
@@ -183,15 +188,13 @@ export interface StageHandlerInternal extends StageHandler {
     isVisual?: boolean; // PENDING: not used
     isLayout?: boolean; // PENDING: not used
 }
+
+
 export type StageHandlerProgressParams = TaskProgressParams;
 export interface StageHandlerProgressExecutor {
     dataEach?: (data: List, idx: number) => void;
     progress?: (params: StageHandlerProgressParams, data: List) => void;
 }
-export interface StageHandlerReset {
-    (seriesModel: SeriesModel, ecModel: GlobalModel, api: ExtensionAPI, payload?: Payload):
-        StageHandlerProgressExecutor | StageHandlerProgressExecutor[]
-}
 export type StageHandlerPlanReturn = TaskPlanCallbackReturn;
 export interface StageHandlerPlan {
     (seriesModel: SeriesModel, ecModel: GlobalModel, api: ExtensionAPI, payload?: Payload):
@@ -380,7 +383,7 @@ export type OptionDataItem =
 export type OptionDataPrimitive = string | number | Date;
 
 // export type ModelOption = Dictionary<any> | any[] | string | number | boolean | ((...args: any) => any);
-export type ModelOption = Dictionary<any>;
+export type ModelOption = any;
 export type ThemeOption = Dictionary<any>;
 
 export type DisplayState = 'normal' | 'emphasis';
@@ -553,7 +556,7 @@ interface TextCommonOption extends ShadowOptionMixin {
     borderColor?: string
     borderWidth?: number
     borderRadius?: number | [number, number, number, number]
-    padding?: number | [number, number] | [number, number, number, number]
+    padding?: number | number[]
 
     width?: number | string// Percent
     height?: number
diff --git a/src/visual/dataColor.ts b/src/visual/dataColor.ts
index 1aa9a77..a1f3809 100644
--- a/src/visual/dataColor.ts
+++ b/src/visual/dataColor.ts
@@ -17,30 +17,34 @@
 * under the License.
 */
 
-// @ts-nocheck
-
 // Pick color from palette for each data item.
 // Applicable for charts that require applying color palette
 // in data level (like pie, funnel, chord).
 import {createHashMap} from 'zrender/src/core/util';
+import { StageHandler } from '../util/types';
+import SeriesModel from '../model/Series';
+
+interface SeriesModelWithPaletteScope extends SeriesModel {
+    __paletteScope: any
+}
 
-export default function (seriesType) {
+export default function (seriesType: string): StageHandler {
     return {
         getTargetSeries: function (ecModel) {
             // Pie and funnel may use diferrent scope
             var paletteScope = {};
-            var seiresModelMap = createHashMap();
+            var seiresModelMap = createHashMap<SeriesModel>();
 
             ecModel.eachSeriesByType(seriesType, function (seriesModel) {
-                seriesModel.__paletteScope = paletteScope;
+                (seriesModel as SeriesModelWithPaletteScope).__paletteScope = paletteScope;
                 seiresModelMap.set(seriesModel.uid, seriesModel);
             });
 
             return seiresModelMap;
         },
-        reset: function (seriesModel, ecModel) {
+        reset: function (seriesModel) {
             var dataAll = seriesModel.getRawData();
-            var idxMap = {};
+            var idxMap: {[key: number]: number} = {};
             var data = seriesModel.getData();
 
             data.each(function (idx) {
@@ -68,7 +72,7 @@ export default function (seriesType) {
                     var color = itemModel.get('itemStyle.color')
                         || seriesModel.getColorFromPalette(
                             dataAll.getName(rawIdx) || (rawIdx + ''),
-                            seriesModel.__paletteScope,
+                            (seriesModel as SeriesModelWithPaletteScope).__paletteScope,
                             dataAll.count()
                         );
                     // Data is not filtered
diff --git a/src/visual/seriesColor.ts b/src/visual/seriesColor.ts
index d95ad67..f5bd265 100644
--- a/src/visual/seriesColor.ts
+++ b/src/visual/seriesColor.ts
@@ -21,8 +21,9 @@
 
 import Gradient from 'zrender/src/graphic/Gradient';
 import {isFunction} from 'zrender/src/core/util';
+import { StageHandler } from '../util/types';
 
-export default {
+const seriesColorTask: StageHandler = {
     createOnAllSeries: true,
     performRawSeries: true,
     reset: function (seriesModel, ecModel) {
@@ -73,3 +74,4 @@ export default {
         }
     }
 };
+export default seriesColorTask;
\ No newline at end of file


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@echarts.apache.org
For additional commands, e-mail: commits-help@echarts.apache.org


[incubator-echarts] 01/02: fix: rollback previous commit about Model only support object becuase of performance drops

Posted by sh...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

shenyi pushed a commit to branch typescript
in repository https://gitbox.apache.org/repos/asf/incubator-echarts.git

commit bfa66493bce54bb1ed5e58310576f089d22e750b
Author: pissang <bm...@gmail.com>
AuthorDate: Wed Feb 19 17:01:47 2020 +0800

    fix: rollback previous commit about Model only support object becuase of performance drops
---
 src/data/List.ts   |  4 ----
 src/model/Model.ts | 15 ++++++++++++---
 2 files changed, 12 insertions(+), 7 deletions(-)

diff --git a/src/data/List.ts b/src/data/List.ts
index 5f8dd2e..0f2f93c 100644
--- a/src/data/List.ts
+++ b/src/data/List.ts
@@ -1555,13 +1555,9 @@ class List {
     /**
      * Get model of one data item.
      */
-    // FIXME Model proxy ?
     getItemModel(idx: number): Model {
         var hostModel = this.hostModel;
         var dataItem = this.getRawDataItem(idx) as ModelOption;
-        if (this._rawData.pure || !isDataItemOption(dataItem)) {
-            dataItem = { value: dataItem };
-        }
         return new Model(dataItem, hostModel, hostModel && hostModel.ecModel);
     }
 
diff --git a/src/model/Model.ts b/src/model/Model.ts
index e9f3351..1925620 100644
--- a/src/model/Model.ts
+++ b/src/model/Model.ts
@@ -42,6 +42,14 @@ import { Dictionary } from 'zrender/src/core/types';
 var mixin = zrUtil.mixin;
 var inner = makeInner();
 
+// Since model.option can be not only `Dictionary` but also primary types,
+// we do this conditional type to avoid getting type 'never';
+type Key<Opt> = Opt extends Dictionary<any>
+    ? keyof Opt : string;
+type Value<Opt, R> = Opt extends Dictionary<any>
+    ? (R extends keyof Opt ? Opt[R] : ModelOption)
+    : ModelOption;
+
 /**
  * @alias module:echarts/model/Model
  * @constructor
@@ -132,11 +140,12 @@ class Model<Opt extends ModelOption = ModelOption> {
     ): Opt[R] {
         var option = this.option;
 
-        var val: Opt[R] = option == null ? null : option[key];
+        var val = option == null ? option : option[key];
         if (val == null) {
             var parentModel = !ignoreParent && getParent(this, key as string);
             if (parentModel) {
-                val = (parentModel as Model<Opt>).getShallow(key);
+                // FIXME:TS do not know how to make it works
+                val = parentModel.getShallow(key);
             }
         }
         return val;
@@ -229,7 +238,7 @@ function doGet(obj: ModelOption, pathArr: string[], parentModel?: Model<Dictiona
             continue;
         }
         // obj could be number/string/... (like 0)
-        obj = obj[pathArr[i]];
+        obj = (obj && typeof obj === 'object') ? obj[pathArr[i] as keyof ModelOption] : null;
         if (obj == null) {
             break;
         }


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@echarts.apache.org
For additional commands, e-mail: commits-help@echarts.apache.org