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:50 UTC

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

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