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


The following commit(s) were added to refs/heads/typescript by this push:
     new 6c589a9  ts: more strict getItemModel type
6c589a9 is described below

commit 6c589a9f71dddf8963561dd14f98b555721e2667
Author: pissang <[email protected]>
AuthorDate: Fri Mar 6 21:32:22 2020 +0800

    ts: more strict getItemModel type
---
 src/chart/boxplot/boxplotVisual.ts             |   4 +-
 src/chart/effectScatter/EffectScatterSeries.ts |  25 +--
 src/chart/graph/GraphSeries.ts                 |   9 +-
 src/chart/graph/GraphView.ts                   |  11 +-
 src/chart/graph/categoryFilter.ts              |   4 +-
 src/chart/graph/categoryVisual.ts              |  34 ++--
 src/chart/graph/createView.ts                  |   4 +-
 src/chart/graph/edgeVisual.ts                  |   4 +-
 src/chart/graph/forceLayout.ts                 |   8 +-
 src/chart/graph/simpleLayoutHelper.ts          |   6 +-
 src/chart/heatmap/HeatmapView.ts               |   4 +-
 src/chart/helper/EffectSymbol.ts               |  15 +-
 src/chart/lines/LinesSeries.ts                 | 216 ++++++++++++++++++-------
 src/chart/lines/linesLayout.ts                 | 111 ++++++-------
 src/chart/lines/linesVisual.ts                 |  26 +--
 src/chart/parallel/ParallelSeries.ts           |   2 +-
 src/chart/scatter/ScatterSeries.ts             |   1 +
 src/data/Graph.ts                              |  14 +-
 src/data/List.ts                               |   7 +-
 src/data/Tree.ts                               |   8 +-
 src/model/Series.ts                            |   8 +-
 src/util/types.ts                              |   4 +-
 src/visual/seriesColor.ts                      |  36 ++---
 23 files changed, 349 insertions(+), 212 deletions(-)

diff --git a/src/chart/boxplot/boxplotVisual.ts 
b/src/chart/boxplot/boxplotVisual.ts
index 8443c18..ba75c13 100644
--- a/src/chart/boxplot/boxplotVisual.ts
+++ b/src/chart/boxplot/boxplotVisual.ts
@@ -19,7 +19,7 @@
 
 import GlobalModel from '../../model/Global';
 import ExtensionAPI from '../../ExtensionAPI';
-import BoxplotSeriesModel from './BoxplotSeries';
+import BoxplotSeriesModel, { BoxplotDataItemOption } from './BoxplotSeries';
 
 var borderColorQuery = ['itemStyle', 'borderColor'] as const;
 
@@ -42,7 +42,7 @@ export default function (ecModel: GlobalModel, api: 
ExtensionAPI) {
         // Only visible series has each data be visual encoded
         if (!ecModel.isSeriesFiltered(seriesModel)) {
             data.each(function (idx) {
-                var itemModel = data.getItemModel(idx);
+                var itemModel = data.getItemModel<BoxplotDataItemOption>(idx);
                 data.setItemVisual(
                     idx,
                     {color: itemModel.get(borderColorQuery, true)}
diff --git a/src/chart/effectScatter/EffectScatterSeries.ts 
b/src/chart/effectScatter/EffectScatterSeries.ts
index bbbb8d3..9d1196c 100644
--- a/src/chart/effectScatter/EffectScatterSeries.ts
+++ b/src/chart/effectScatter/EffectScatterSeries.ts
@@ -37,6 +37,17 @@ import List from '../../data/List';
 
 type ScatterDataValue = OptionDataValue | OptionDataValue[]
 
+interface RippleEffect {
+    period?: number
+    /**
+     * Scale of ripple
+     */
+    scale?: number
+
+    brushType?: 'fill' | 'stroke'
+
+    color?: ZRColor
+}
 export interface EffectScatterDataItemOption extends SymbolOptionMixin {
     name?: string
 
@@ -49,6 +60,8 @@ export interface EffectScatterDataItemOption extends 
SymbolOptionMixin {
         itemStyle?: ItemStyleOption
         label?: LabelOption
     }
+
+    rippleEffect?: RippleEffect
 }
 
 export interface EffectScatterSeriesOption extends SeriesOption,
@@ -67,17 +80,7 @@ export interface EffectScatterSeriesOption extends 
SeriesOption,
     /**
      * Ripple effect config
      */
-    rippleEffect?: {
-        period?: number
-        /**
-         * Scale of ripple
-         */
-        scale?: number
-
-        brushType?: 'fill' | 'stroke'
-
-        color?: ZRColor
-    }
+    rippleEffect?: RippleEffect
 
     data?: (EffectScatterDataItemOption | OptionDataValue)[]
 }
diff --git a/src/chart/graph/GraphSeries.ts b/src/chart/graph/GraphSeries.ts
index a2be48d..b2d55e7 100644
--- a/src/chart/graph/GraphSeries.ts
+++ b/src/chart/graph/GraphSeries.ts
@@ -79,7 +79,10 @@ export interface GraphNodeItemOption extends 
SymbolOptionMixin {
      */
     fixed?: boolean
 
-    category?: number
+    /**
+     * Index or name of category
+     */
+    category?: number | string
 
     draggable?: boolean
 
@@ -112,6 +115,10 @@ export interface GraphEdgeItemOption {
     symbol?: string | string[]
 
     symbolSize?: number | number[]
+
+    ignoreForceLayout?: boolean
+
+    focusNodeAdjacency?: boolean
 }
 
 export interface GraphCategoryItemOption extends SymbolOptionMixin {
diff --git a/src/chart/graph/GraphView.ts b/src/chart/graph/GraphView.ts
index 12f3f6a..0963f01 100644
--- a/src/chart/graph/GraphView.ts
+++ b/src/chart/graph/GraphView.ts
@@ -29,7 +29,7 @@ import {getNodeGlobalScale} from './graphHelper';
 import ChartView from '../../view/Chart';
 import GlobalModel from '../../model/Global';
 import ExtensionAPI from '../../ExtensionAPI';
-import GraphSeriesModel, { GraphNodeItemOption } from './GraphSeries';
+import GraphSeriesModel, { GraphNodeItemOption, GraphEdgeItemOption } from 
'./GraphSeries';
 import { CoordinateSystem } from '../../coord/CoordinateSystem';
 import View from '../../coord/View';
 import { GraphNode, GraphEdge } from '../../data/Graph';
@@ -59,7 +59,8 @@ function getItemOpacity(
     opacityPath: typeof nodeOpacityPath | typeof lineOpacityPath
 ): number {
     var opacity = item.getVisual('opacity');
-    return opacity != null ? opacity : item.getModel().get(opacityPath);
+    return opacity != null
+        ? opacity : item.getModel<any>().get(opacityPath);
 }
 
 function fadeOutItem(
@@ -236,7 +237,7 @@ class GraphView extends ChartView {
             (el as any)[FOCUS_ADJACENCY] && el.off('mouseover', (el as 
any)[FOCUS_ADJACENCY]);
             (el as any)[UNFOCUS_ADJACENCY] && el.off('mouseout', (el as 
any)[UNFOCUS_ADJACENCY]);
 
-            if (edge.getModel().get('focusNodeAdjacency')) {
+            if 
(edge.getModel<GraphEdgeItemOption>().get('focusNodeAdjacency')) {
                 el.on('mouseover', (el as any)[FOCUS_ADJACENCY] = function () {
                     graphView._clearTimer();
                     api.dispatchAction({
@@ -256,8 +257,8 @@ class GraphView extends ChartView {
         var cx = data.getLayout('cx');
         var cy = data.getLayout('cy');
         data.eachItemGraphicEl(function (el: Symbol, idx) {
-            var itemModel = data.getItemModel(idx);
-            var labelRotate = itemModel.get('label.rotate') || 0;
+            var itemModel = data.getItemModel<GraphNodeItemOption>(idx);
+            var labelRotate = itemModel.get(['label', 'rotate']) || 0;
             var symbolPath = el.getSymbolPath();
             if (circularRotateLabel) {
                 var pos = data.getItemLayout(idx);
diff --git a/src/chart/graph/categoryFilter.ts 
b/src/chart/graph/categoryFilter.ts
index 66b6b4e..11edc30 100644
--- a/src/chart/graph/categoryFilter.ts
+++ b/src/chart/graph/categoryFilter.ts
@@ -18,7 +18,7 @@
 */
 
 import GlobalModel from '../../model/Global';
-import GraphSeriesModel from './GraphSeries';
+import GraphSeriesModel, { GraphNodeItemOption } from './GraphSeries';
 import type LegendModel from '../../component/legend/LegendModel';
 
 export default function (ecModel: GlobalModel) {
@@ -36,7 +36,7 @@ export default function (ecModel: GlobalModel) {
         var categoryNames = categoriesData.mapArray(categoriesData.getName);
 
         data.filterSelf(function (idx) {
-            var model = data.getItemModel(idx);
+            var model = data.getItemModel<GraphNodeItemOption>(idx);
             var category = model.getShallow('category');
             if (category != null) {
                 if (typeof category === 'number') {
diff --git a/src/chart/graph/categoryVisual.ts 
b/src/chart/graph/categoryVisual.ts
index 2ee40b1..7803c6c 100644
--- a/src/chart/graph/categoryVisual.ts
+++ b/src/chart/graph/categoryVisual.ts
@@ -18,7 +18,7 @@
 */
 
 import GlobalModel from '../../model/Global';
-import GraphSeriesModel from './GraphSeries';
+import GraphSeriesModel, { GraphNodeItemOption } from './GraphSeries';
 import { Dictionary, ColorString } from '../../util/types';
 
 export default function (ecModel: GlobalModel) {
@@ -34,17 +34,23 @@ export default function (ecModel: GlobalModel) {
             var name = categoriesData.getName(idx);
             // Add prefix to avoid conflict with Object.prototype.
             categoryNameIdxMap['ec-' + name] = idx;
-            var itemModel = categoriesData.getItemModel(idx);
+            var itemModel = 
categoriesData.getItemModel<GraphNodeItemOption>(idx);
 
-            var color = itemModel.get('itemStyle.color')
+            var color = itemModel.get(['itemStyle', 'color'])
                 || seriesModel.getColorFromPalette(name, paletteScope);
             categoriesData.setItemVisual(idx, 'color', color);
 
-            var itemStyleList = ['opacity', 'symbol', 'symbolSize', 
'symbolKeepAspect'];
-            for (var i = 0; i < itemStyleList.length; i++) {
-                var itemStyle = itemModel.getShallow(itemStyleList[i], true);
-                if (itemStyle != null) {
-                    categoriesData.setItemVisual(idx, itemStyleList[i], 
itemStyle);
+            var opacity = itemModel.get(['itemStyle', 'opacity']);
+            if (opacity != null) {
+                categoriesData.setItemVisual(idx, 'opacity', opacity);
+            }
+
+            var symbolVisualList = ['symbol', 'symbolSize', 
'symbolKeepAspect'] as const;
+
+            for (var i = 0; i < symbolVisualList.length; i++) {
+                var symbolVisual = itemModel.getShallow(symbolVisualList[i], 
true);
+                if (symbolVisual != null) {
+                    categoriesData.setItemVisual(idx, symbolVisualList[i], 
symbolVisual);
                 }
             }
         });
@@ -52,20 +58,20 @@ export default function (ecModel: GlobalModel) {
         // Assign category color to visual
         if (categoriesData.count()) {
             data.each(function (idx) {
-                var model = data.getItemModel(idx);
+                var model = data.getItemModel<GraphNodeItemOption>(idx);
                 var category = model.getShallow('category');
                 if (category != null) {
                     if (typeof category === 'string') {
                         category = categoryNameIdxMap['ec-' + category];
                     }
 
-                    var itemStyleList = ['color', 'opacity', 'symbol', 
'symbolSize', 'symbolKeepAspect'];
+                    var visualList = ['color', 'opacity', 'symbol', 
'symbolSize', 'symbolKeepAspect'] as const;
 
-                    for (var i = 0; i < itemStyleList.length; i++) {
-                        if (data.getItemVisual(idx, itemStyleList[i], true) == 
null) {
+                    for (var i = 0; i < visualList.length; i++) {
+                        if (data.getItemVisual(idx, visualList[i], true) == 
null) {
                             data.setItemVisual(
-                                idx, itemStyleList[i],
-                                categoriesData.getItemVisual(category, 
itemStyleList[i])
+                                idx, visualList[i],
+                                categoriesData.getItemVisual(category, 
visualList[i])
                             );
                         }
                     }
diff --git a/src/chart/graph/createView.ts b/src/chart/graph/createView.ts
index ceaa7ab..bca60e2 100644
--- a/src/chart/graph/createView.ts
+++ b/src/chart/graph/createView.ts
@@ -21,7 +21,7 @@
 import View from '../../coord/View';
 import {getLayoutRect} from '../../util/layout';
 import * as bbox from 'zrender/src/core/bbox';
-import GraphSeriesModel from './GraphSeries';
+import GraphSeriesModel, { GraphNodeItemOption } from './GraphSeries';
 import ExtensionAPI from '../../ExtensionAPI';
 import GlobalModel from '../../model/Global';
 import { extend } from 'zrender/src/core/util';
@@ -44,7 +44,7 @@ export default function (ecModel: GlobalModel, api: 
ExtensionAPI) {
 
             var data = seriesModel.getData();
             var positions = data.mapArray(function (idx) {
-                var itemModel = data.getItemModel(idx);
+                var itemModel = data.getItemModel<GraphNodeItemOption>(idx);
                 return [+itemModel.get('x'), +itemModel.get('y')];
             });
 
diff --git a/src/chart/graph/edgeVisual.ts b/src/chart/graph/edgeVisual.ts
index e5fb1d7..ffa0eb6 100644
--- a/src/chart/graph/edgeVisual.ts
+++ b/src/chart/graph/edgeVisual.ts
@@ -18,7 +18,7 @@
 */
 
 import GlobalModel from '../../model/Global';
-import GraphSeriesModel from './GraphSeries';
+import GraphSeriesModel, { GraphEdgeItemOption } from './GraphSeries';
 
 function normalize(a: string | number | (string | number)[]): (string | 
number)[] {
     if (!(a instanceof Array)) {
@@ -45,7 +45,7 @@ export default function (ecModel: GlobalModel) {
         edgeData.setVisual('opacity', seriesModel.get(opacityQuery));
 
         edgeData.each(function (idx) {
-            var itemModel = edgeData.getItemModel(idx);
+            var itemModel = edgeData.getItemModel<GraphEdgeItemOption>(idx);
             var edge = graph.getEdgeByIndex(idx);
             var symbolType = normalize(itemModel.getShallow('symbol', true));
             var symbolSize = normalize(itemModel.getShallow('symbolSize', 
true));
diff --git a/src/chart/graph/forceLayout.ts b/src/chart/graph/forceLayout.ts
index e7501ee..1ffecec 100644
--- a/src/chart/graph/forceLayout.ts
+++ b/src/chart/graph/forceLayout.ts
@@ -24,7 +24,7 @@ import {linearMap} from '../../util/number';
 import * as vec2 from 'zrender/src/core/vector';
 import * as zrUtil from 'zrender/src/core/util';
 import GlobalModel from '../../model/Global';
-import GraphSeriesModel from './GraphSeries';
+import GraphSeriesModel, { GraphNodeItemOption, GraphEdgeItemOption } from 
'./GraphSeries';
 
 export interface ForceLayoutInstance {
     step(cb: (stopped: boolean) => void): void
@@ -82,7 +82,7 @@ export default function (ecModel: GlobalModel) {
                 return {
                     w: rep,
                     rep: rep,
-                    fixed: nodeData.getItemModel(idx).get('fixed'),
+                    fixed: 
nodeData.getItemModel<GraphNodeItemOption>(idx).get('fixed'),
                     p: (!point || isNaN(point[0]) || isNaN(point[1])) ? null : 
point
                 };
             });
@@ -92,12 +92,12 @@ export default function (ecModel: GlobalModel) {
                 if (isNaN(d)) {
                     d = (edgeLengthArr[0] + edgeLengthArr[1]) / 2;
                 }
-                var edgeModel = edge.getModel();
+                var edgeModel = edge.getModel<GraphEdgeItemOption>();
                 return {
                     n1: nodes[edge.node1.dataIndex],
                     n2: nodes[edge.node2.dataIndex],
                     d: d,
-                    curveness: edgeModel.get('lineStyle.curveness') || 0,
+                    curveness: edgeModel.get(['lineStyle', 'curveness']) || 0,
                     ignoreForceLayout: edgeModel.get('ignoreForceLayout')
                 };
             });
diff --git a/src/chart/graph/simpleLayoutHelper.ts 
b/src/chart/graph/simpleLayoutHelper.ts
index 9a5abcc..58d5cae 100644
--- a/src/chart/graph/simpleLayoutHelper.ts
+++ b/src/chart/graph/simpleLayoutHelper.ts
@@ -18,7 +18,7 @@
 */
 
 import * as vec2 from 'zrender/src/core/vector';
-import GraphSeriesModel from './GraphSeries';
+import GraphSeriesModel, { GraphNodeItemOption, GraphEdgeItemOption } from 
'./GraphSeries';
 import Graph from '../../data/Graph';
 
 export function simpleLayout(seriesModel: GraphSeriesModel) {
@@ -29,7 +29,7 @@ export function simpleLayout(seriesModel: GraphSeriesModel) {
     var graph = seriesModel.getGraph();
 
     graph.eachNode(function (node) {
-        var model = node.getModel();
+        var model = node.getModel<GraphNodeItemOption>();
         node.setLayout([+model.get('x'), +model.get('y')]);
     });
 
@@ -38,7 +38,7 @@ export function simpleLayout(seriesModel: GraphSeriesModel) {
 
 export function simpleLayoutEdge(graph: Graph) {
     graph.eachEdge(function (edge) {
-        var curveness = edge.getModel().get('lineStyle.curveness') || 0;
+        var curveness = edge.getModel<GraphEdgeItemOption>().get(['lineStyle', 
'curveness']) || 0;
         var p1 = vec2.clone(edge.node1.getLayout());
         var p2 = vec2.clone(edge.node2.getLayout());
         var points = [p1, p2];
diff --git a/src/chart/heatmap/HeatmapView.ts b/src/chart/heatmap/HeatmapView.ts
index 90b98c7..f023eaa 100644
--- a/src/chart/heatmap/HeatmapView.ts
+++ b/src/chart/heatmap/HeatmapView.ts
@@ -22,7 +22,7 @@ import * as graphic from '../../util/graphic';
 import HeatmapLayer from './HeatmapLayer';
 import * as zrUtil from 'zrender/src/core/util';
 import ChartView from '../../view/Chart';
-import HeatmapSeriesModel from './HeatmapSeries';
+import HeatmapSeriesModel, { HeatmapDataItemOption } from './HeatmapSeries';
 import type GlobalModel from '../../model/Global';
 import type ExtensionAPI from '../../ExtensionAPI';
 import type VisualMapModel from '../../component/visualMap/VisualMapModel';
@@ -245,7 +245,7 @@ class HeatmapView extends ChartView {
                 });
             }
 
-            var itemModel = data.getItemModel(idx);
+            var itemModel = data.getItemModel<HeatmapDataItemOption>(idx);
 
             // Optimization for large datset
             if (data.hasItemOption) {
diff --git a/src/chart/helper/EffectSymbol.ts b/src/chart/helper/EffectSymbol.ts
index fed7d5d..618e368 100644
--- a/src/chart/helper/EffectSymbol.ts
+++ b/src/chart/helper/EffectSymbol.ts
@@ -30,6 +30,7 @@ import SymbolClz from './Symbol';
 import List from '../../data/List';
 import type { ZRColor } from '../../util/types';
 import type Displayable from 'zrender/src/graphic/Displayable';
+import { EffectScatterDataItemOption } from 
'../effectScatter/EffectScatterSeries';
 
 var EFFECT_RIPPLE_NUMBER = 3;
 
@@ -175,7 +176,7 @@ class EffectSymbol extends Group {
         (this.childAt(0) as SymbolClz).updateData(data, idx);
 
         var rippleGroup = this.childAt(1);
-        var itemModel = data.getItemModel(idx);
+        var itemModel = data.getItemModel<EffectScatterDataItemOption>(idx);
         var symbolType = data.getItemVisual(idx, 'symbol');
         var symbolSize = normalizeSymbolSize(data.getItemVisual(idx, 
'symbolSize'));
         var color = data.getItemVisual(idx, 'color');
@@ -197,15 +198,15 @@ class EffectSymbol extends Group {
         var effectCfg: RippleEffectCfg = {};
 
         effectCfg.showEffectOn = seriesModel.get('showEffectOn');
-        effectCfg.rippleScale = itemModel.get('rippleEffect.scale');
-        effectCfg.brushType = itemModel.get('rippleEffect.brushType');
-        effectCfg.period = itemModel.get('rippleEffect.period') * 1000;
+        effectCfg.rippleScale = itemModel.get(['rippleEffect', 'scale']);
+        effectCfg.brushType = itemModel.get(['rippleEffect', 'brushType']);
+        effectCfg.period = itemModel.get(['rippleEffect', 'period']) * 1000;
         effectCfg.effectOffset = idx / data.count();
-        effectCfg.z = itemModel.getShallow('z') || 0;
-        effectCfg.zlevel = itemModel.getShallow('zlevel') || 0;
+        effectCfg.z = seriesModel.getShallow('z') || 0;
+        effectCfg.zlevel = seriesModel.getShallow('zlevel') || 0;
         effectCfg.symbolType = symbolType;
         effectCfg.color = color;
-        effectCfg.rippleEffectColor = itemModel.get('rippleEffect.color');
+        effectCfg.rippleEffectColor = itemModel.get(['rippleEffect', 'color']);
 
         this.off('mouseover').off('mouseout').off('emphasis').off('normal');
 
diff --git a/src/chart/lines/LinesSeries.ts b/src/chart/lines/LinesSeries.ts
index 0801875..40f79af 100644
--- a/src/chart/lines/LinesSeries.ts
+++ b/src/chart/lines/LinesSeries.ts
@@ -17,8 +17,6 @@
 * under the License.
 */
 
-// @ts-nocheck
-
 /* global Uint32Array, Float64Array, Float32Array */
 
 import {__DEV__} from '../../config';
@@ -27,22 +25,35 @@ import List from '../../data/List';
 import { concatArray, mergeAll, map } from 'zrender/src/core/util';
 import {encodeHTML} from '../../util/format';
 import CoordinateSystem from '../../CoordinateSystem';
+import {
+    SeriesOption,
+    SeriesOnCartesianOptionMixin,
+    SeriesOnGeoOptionMixin,
+    SeriesOnPolarOptionMixin,
+    SeriesOnCalendarOptionMixin,
+    ColorString,
+    SeriesLargeOptionMixin,
+    LabelOption,
+    LineStyleOption,
+    OptionDataValue
+} from '../../util/types';
+import GlobalModel from '../../model/Global';
 
 var Uint32Arr = typeof Uint32Array === 'undefined' ? Array : Uint32Array;
 var Float64Arr = typeof Float64Array === 'undefined' ? Array : Float64Array;
 
-function compatEc2(seriesOpt) {
+function compatEc2(seriesOpt: LinesSeriesOption) {
     var data = seriesOpt.data;
-    if (data && data[0] && data[0][0] && data[0][0].coord) {
+    if (data && data[0] && (data as LegacyDataItemOption[][])[0][0] && (data 
as LegacyDataItemOption[][])[0][0].coord) {
         if (__DEV__) {
             console.warn('Lines data configuration has been changed to'
                 + ' { coords:[[1,2],[2,3]] }');
         }
-        seriesOpt.data = map(data, function (itemOpt) {
+        seriesOpt.data = map(data as LegacyDataItemOption[][], function 
(itemOpt) {
             var coords = [
                 itemOpt[0].coord, itemOpt[1].coord
             ];
-            var target = {
+            var target: LinesDataItemOption = {
                 coords: coords
             };
             if (itemOpt[0].name) {
@@ -56,15 +67,113 @@ function compatEc2(seriesOpt) {
     }
 }
 
-var LinesSeries = SeriesModel.extend({
+type LinesCoords = number[][]
+
+type LinesValue = OptionDataValue | OptionDataValue[]
+
+interface LinesLineStyleOption extends LineStyleOption {
+    curveness?: number
+}
+
+// @deprecated
+interface LegacyDataItemOption {
+    coord: number[]
+    name: string
+}
+
+export interface LinesDataItemOption {
+    name?: string
+
+    fromName?: string
+    toName?: string
+
+    symbol?: string[] | string
+    symbolSize?: number[] | number
+
+    coords?: LinesCoords
+
+    value?: LinesValue
+
+    lineStyle?: LinesLineStyleOption
+    label?: LabelOption
+
+    emphasis?: {
+        lineStyle?: LineStyleOption
+        label?: LabelOption
+    }
+}
+
+export interface LinesSeriesOption extends SeriesOption,
+    SeriesOnCartesianOptionMixin, SeriesOnGeoOptionMixin, 
SeriesOnPolarOptionMixin,
+    SeriesOnCalendarOptionMixin, SeriesLargeOptionMixin {
+
+    coordinateSystem?: string
+    hoverAnimation?: boolean
+
+    symbol?: string[] | string
+    symbolSize?: number[] | number
+
+    effect?: {
+        show?: boolean
+        period?: number
+        delay?: number | ((idx: number) => number)
+        /**
+         * If move with constant speed px/sec
+         * period will be ignored if this property is > 0,
+         */
+        constantSpeed?: number
+
+        symbol?: string
+        symbolSize?: number | number[]
+        loop?: boolean
+        /**
+         * Length of trail, 0 - 1
+         */
+        trailLength?: number
+        /**
+         * Default to be same with lineStyle.color
+         */
+        color?: ColorString
+    }
+
+    /**
+     * If lines are polyline
+     * polyline not support curveness, label, animation
+     */
+    polyline?: boolean
+    /**
+     * If clip the overflow.
+     * Available when coordinateSystem is cartesian or polar.
+     */
+    clip?: boolean
+
+    label?: LabelOption
+    lineStyle?: LinesLineStyleOption
+
+    emphasis?: {
+        label?: LabelOption
+        lineStyle?: LineStyleOption
+    }
+
+    data?: LinesDataItemOption[]
+        // Stored as a flat array. In format
+        // Points Count(2) | x | y | x | y | Points Count(3) | x |  y | x | y 
| x | y |
+        | ArrayLike<number>
+}
+
+class LinesSeriesModel extends SeriesModel<LinesSeriesOption> {
+
+    static readonly type = 'series.lines'
+    readonly type = LinesSeriesModel.type
 
-    type: 'series.lines',
+    static readonly dependencies = ['grid', 'polar', 'geo', 'calendar']
 
-    dependencies: ['grid', 'polar'],
+    visualColorAccessPath: ['lineStyle', 'color']
 
-    visualColorAccessPath: 'lineStyle.color',
+    private _flatCoords: ArrayLike<number>
+    private _flatCoordsOffset: ArrayLike<number>
 
-    init: function (option) {
+    init(option: LinesSeriesOption) {
         // The input data may be null/undefined.
         option.data = option.data || [];
 
@@ -78,10 +187,10 @@ var LinesSeries = SeriesModel.extend({
             option.data = new Float32Array(result.count);
         }
 
-        LinesSeries.superApply(this, 'init', arguments);
-    },
+        super.init.apply(this, arguments as any);
+    }
 
-    mergeOption: function (option) {
+    mergeOption(option: LinesSeriesOption) {
         // The input data may be null/undefined.
         option.data = option.data || [];
 
@@ -97,10 +206,10 @@ var LinesSeries = SeriesModel.extend({
             }
         }
 
-        LinesSeries.superApply(this, 'mergeOption', arguments);
-    },
+        super.mergeOption.apply(this, arguments as any);
+    }
 
-    appendData: function (params) {
+    appendData(params: Pick<LinesSeriesOption, 'data'>) {
         var result = this._processFlatCoordsArray(params.data);
         if (result.flatCoords) {
             if (!this._flatCoords) {
@@ -115,10 +224,10 @@ var LinesSeries = SeriesModel.extend({
         }
 
         this.getRawData().appendData(params.data);
-    },
+    }
 
-    _getCoordsFromItemModel: function (idx) {
-        var itemModel = this.getData().getItemModel(idx);
+    _getCoordsFromItemModel(idx: number) {
+        var itemModel = this.getData().getItemModel<LinesDataItemOption>(idx);
         var coords = (itemModel.option instanceof Array)
             ? itemModel.option : itemModel.getShallow('coords');
 
@@ -130,18 +239,18 @@ var LinesSeries = SeriesModel.extend({
             }
         }
         return coords;
-    },
+    }
 
-    getLineCoordsCount: function (idx) {
+    getLineCoordsCount(idx: number) {
         if (this._flatCoordsOffset) {
             return this._flatCoordsOffset[idx * 2 + 1];
         }
         else {
             return this._getCoordsFromItemModel(idx).length;
         }
-    },
+    }
 
-    getLineCoords: function (idx, out) {
+    getLineCoords(idx: number, out: number[][]) {
         if (this._flatCoordsOffset) {
             var offset = this._flatCoordsOffset[idx * 2];
             var len = this._flatCoordsOffset[idx * 2 + 1];
@@ -161,9 +270,9 @@ var LinesSeries = SeriesModel.extend({
             }
             return coords.length;
         }
-    },
+    }
 
-    _processFlatCoordsArray: function (data) {
+    _processFlatCoordsArray(data: LinesSeriesOption['data']) {
         var startOffset = 0;
         if (this._flatCoords) {
             startOffset = this._flatCoords.length;
@@ -173,21 +282,21 @@ var LinesSeries = SeriesModel.extend({
         if (typeof data[0] === 'number') {
             var len = data.length;
             // Store offset and len of each segment
-            var coordsOffsetAndLenStorage = new Uint32Arr(len);
-            var coordsStorage = new Float64Arr(len);
+            var coordsOffsetAndLenStorage = new Uint32Arr(len) as Uint32Array;
+            var coordsStorage = new Float64Arr(len) as Float64Array;
             var coordsCursor = 0;
             var offsetCursor = 0;
             var dataCount = 0;
             for (var i = 0; i < len;) {
                 dataCount++;
-                var count = data[i++];
+                var count = data[i++] as number;
                 // Offset
                 coordsOffsetAndLenStorage[offsetCursor++] = coordsCursor + 
startOffset;
                 // Len
                 coordsOffsetAndLenStorage[offsetCursor++] = count;
                 for (var k = 0; k < count; k++) {
-                    var x = data[i++];
-                    var y = data[i++];
+                    var x = data[i++] as number;
+                    var y = data[i++] as number;
                     coordsStorage[coordsCursor++] = x;
                     coordsStorage[coordsCursor++] = y;
 
@@ -211,9 +320,9 @@ var LinesSeries = SeriesModel.extend({
             flatCoords: null,
             count: data.length
         };
-    },
+    }
 
-    getInitialData: function (option, ecModel) {
+    getInitialData(option: LinesSeriesOption, ecModel: GlobalModel) {
         if (__DEV__) {
             var CoordSys = CoordinateSystem.get(option.coordinateSystem);
             if (!CoordSys) {
@@ -239,11 +348,11 @@ var LinesSeries = SeriesModel.extend({
         });
 
         return lineData;
-    },
+    }
 
-    formatTooltip: function (dataIndex) {
+    formatTooltip(dataIndex: number) {
         var data = this.getData();
-        var itemModel = data.getItemModel(dataIndex);
+        var itemModel = data.getItemModel<LinesDataItemOption>(dataIndex);
         var name = itemModel.get('name');
         if (name) {
             return name;
@@ -255,29 +364,29 @@ var LinesSeries = SeriesModel.extend({
         toName != null && html.push(toName);
 
         return encodeHTML(html.join(' > '));
-    },
+    }
 
-    preventIncremental: function () {
-        return !!this.get('effect.show');
-    },
+    preventIncremental() {
+        return !!this.get(['effect', 'show']);
+    }
 
-    getProgressive: function () {
+    getProgressive() {
         var progressive = this.option.progressive;
         if (progressive == null) {
             return this.option.large ? 1e4 : this.get('progressive');
         }
         return progressive;
-    },
+    }
 
-    getProgressiveThreshold: function () {
+    getProgressiveThreshold() {
         var progressiveThreshold = this.option.progressiveThreshold;
         if (progressiveThreshold == null) {
             return this.option.large ? 2e4 : this.get('progressiveThreshold');
         }
         return progressiveThreshold;
-    },
+    }
 
-    defaultOption: {
+    static defaultOption: LinesSeriesOption = {
         coordinateSystem: 'geo',
         zlevel: 0,
         z: 2,
@@ -296,30 +405,19 @@ var LinesSeries = SeriesModel.extend({
         effect: {
             show: false,
             period: 4,
-            // Animation delay. support callback
-            // delay: 0,
-            // If move with constant speed px/sec
-            // period will be ignored if this property is > 0,
             constantSpeed: 0,
             symbol: 'circle',
             symbolSize: 3,
             loop: true,
-            // Length of trail, 0 - 1
             trailLength: 0.2
-            // Same with lineStyle.color
-            // color
         },
 
         large: false,
         // Available when large is true
         largeThreshold: 2000,
 
-        // If lines are polyline
-        // polyline not support curveness, label, animation
         polyline: false,
 
-        // If clip the overflow.
-        // Available when coordinateSystem is cartesian or polar.
         clip: true,
 
         label: {
@@ -333,6 +431,8 @@ var LinesSeries = SeriesModel.extend({
             opacity: 0.5
         }
     }
-});
+}
+
+SeriesModel.registerClass(LinesSeriesModel);
 
-export default LinesSeries;
\ No newline at end of file
+export default LinesSeriesModel;
\ No newline at end of file
diff --git a/src/chart/lines/linesLayout.ts b/src/chart/lines/linesLayout.ts
index a041a1b..8d5c613 100644
--- a/src/chart/lines/linesLayout.ts
+++ b/src/chart/lines/linesLayout.ts
@@ -17,82 +17,83 @@
 * under the License.
 */
 
-// @ts-nocheck
-
 /* global Float32Array */
 
 import createRenderPlanner from '../helper/createRenderPlanner';
+import { StageHandler } from '../../util/types';
+import LinesSeriesModel, {LinesDataItemOption} from './LinesSeries';
 
-export default {
+const linesLayout: StageHandler = {
     seriesType: 'lines',
 
     plan: createRenderPlanner(),
 
-    reset: function (seriesModel) {
+    reset: function (seriesModel: LinesSeriesModel) {
         var coordSys = seriesModel.coordinateSystem;
         var isPolyline = seriesModel.get('polyline');
         var isLarge = seriesModel.pipelineContext.large;
+        return {
+            progress(params, lineData) {
+                var lineCoords: number[][] = [];
+                if (isLarge) {
+                    var points;
+                    var segCount = params.end - params.start;
+                    if (isPolyline) {
+                        var totalCoordsCount = 0;
+                        for (var i = params.start; i < params.end; i++) {
+                            totalCoordsCount += 
seriesModel.getLineCoordsCount(i);
+                        }
+                        points = new Float32Array(segCount + totalCoordsCount 
* 2);
+                    }
+                    else {
+                        points = new Float32Array(segCount * 4);
+                    }
 
-        function progress(params, lineData) {
-            var lineCoords = [];
-            if (isLarge) {
-                var points;
-                var segCount = params.end - params.start;
-                if (isPolyline) {
-                    var totalCoordsCount = 0;
+                    var offset = 0;
+                    var pt: number[] = [];
                     for (var i = params.start; i < params.end; i++) {
-                        totalCoordsCount += seriesModel.getLineCoordsCount(i);
+                        var len = seriesModel.getLineCoords(i, lineCoords);
+                        if (isPolyline) {
+                            points[offset++] = len;
+                        }
+                        for (var k = 0; k < len; k++) {
+                            pt = coordSys.dataToPoint(lineCoords[k], false, 
pt);
+                            points[offset++] = pt[0];
+                            points[offset++] = pt[1];
+                        }
                     }
-                    points = new Float32Array(segCount + totalCoordsCount * 2);
-                }
-                else {
-                    points = new Float32Array(segCount * 4);
-                }
 
-                var offset = 0;
-                var pt = [];
-                for (var i = params.start; i < params.end; i++) {
-                    var len = seriesModel.getLineCoords(i, lineCoords);
-                    if (isPolyline) {
-                        points[offset++] = len;
-                    }
-                    for (var k = 0; k < len; k++) {
-                        pt = coordSys.dataToPoint(lineCoords[k], false, pt);
-                        points[offset++] = pt[0];
-                        points[offset++] = pt[1];
-                    }
+                    lineData.setLayout('linesPoints', points);
                 }
+                else {
+                    for (var i = params.start; i < params.end; i++) {
+                        var itemModel = 
lineData.getItemModel<LinesDataItemOption>(i);
+                        var len = seriesModel.getLineCoords(i, lineCoords);
 
-                lineData.setLayout('linesPoints', points);
-            }
-            else {
-                for (var i = params.start; i < params.end; i++) {
-                    var itemModel = lineData.getItemModel(i);
-                    var len = seriesModel.getLineCoords(i, lineCoords);
-
-                    var pts = [];
-                    if (isPolyline) {
-                        for (var j = 0; j < len; j++) {
-                            pts.push(coordSys.dataToPoint(lineCoords[j]));
+                        var pts = [];
+                        if (isPolyline) {
+                            for (var j = 0; j < len; j++) {
+                                pts.push(coordSys.dataToPoint(lineCoords[j]));
+                            }
                         }
-                    }
-                    else {
-                        pts[0] = coordSys.dataToPoint(lineCoords[0]);
-                        pts[1] = coordSys.dataToPoint(lineCoords[1]);
+                        else {
+                            pts[0] = coordSys.dataToPoint(lineCoords[0]);
+                            pts[1] = coordSys.dataToPoint(lineCoords[1]);
 
-                        var curveness = itemModel.get('lineStyle.curveness');
-                        if (+curveness) {
-                            pts[2] = [
-                                (pts[0][0] + pts[1][0]) / 2 - (pts[0][1] - 
pts[1][1]) * curveness,
-                                (pts[0][1] + pts[1][1]) / 2 - (pts[1][0] - 
pts[0][0]) * curveness
-                            ];
+                            var curveness = itemModel.get(['lineStyle', 
'curveness']);
+                            if (+curveness) {
+                                pts[2] = [
+                                    (pts[0][0] + pts[1][0]) / 2 - (pts[0][1] - 
pts[1][1]) * curveness,
+                                    (pts[0][1] + pts[1][1]) / 2 - (pts[1][0] - 
pts[0][0]) * curveness
+                                ];
+                            }
                         }
+                        lineData.setItemLayout(i, pts);
                     }
-                    lineData.setItemLayout(i, pts);
                 }
             }
-        }
-
-        return { progress: progress };
+        };
     }
-};
\ No newline at end of file
+};
+
+export default linesLayout;
\ No newline at end of file
diff --git a/src/chart/lines/linesVisual.ts b/src/chart/lines/linesVisual.ts
index ed2c379..fd84a0b 100644
--- a/src/chart/lines/linesVisual.ts
+++ b/src/chart/lines/linesVisual.ts
@@ -17,21 +17,25 @@
 * under the License.
 */
 
-// @ts-nocheck
+import { StageHandler } from '../../util/types';
+import List from '../../data/List';
+import LinesSeriesModel, { LinesDataItemOption } from './LinesSeries';
+import Model from '../../model/Model';
 
-
-function normalize(a) {
+function normalize(a: string | string[]): string[]
+function normalize(a: number | number[]): number[]
+function normalize(a: string | number | (string | number)[]): (string | 
number)[] {
     if (!(a instanceof Array)) {
         a = [a, a];
     }
     return a;
 }
 
-var opacityQuery = 'lineStyle.opacity'.split('.');
+var opacityQuery = ['lineStyle', 'opacity'] as const;
 
-export default {
+const linesVisual: StageHandler = {
     seriesType: 'lines',
-    reset: function (seriesModel, ecModel, api) {
+    reset(seriesModel: LinesSeriesModel) {
         var symbolType = normalize(seriesModel.get('symbol'));
         var symbolSize = normalize(seriesModel.get('symbolSize'));
         var data = seriesModel.getData();
@@ -42,8 +46,8 @@ export default {
         data.setVisual('toSymbolSize', symbolSize && symbolSize[1]);
         data.setVisual('opacity', seriesModel.get(opacityQuery));
 
-        function dataEach(data, idx) {
-            var itemModel = data.getItemModel(idx);
+        function dataEach(data: List<LinesSeriesModel>, idx: number): void {
+            var itemModel = data.getItemModel(idx) as 
Model<LinesDataItemOption>;
             var symbolType = normalize(itemModel.getShallow('symbol', true));
             var symbolSize = normalize(itemModel.getShallow('symbolSize', 
true));
             var opacity = itemModel.get(opacityQuery);
@@ -56,6 +60,10 @@ export default {
             data.setItemVisual(idx, 'opacity', opacity);
         }
 
-        return {dataEach: data.hasItemOption ? dataEach : null};
+        return {
+            dataEach: data.hasItemOption ? dataEach : null
+        };
     }
 };
+
+export default linesVisual;
\ No newline at end of file
diff --git a/src/chart/parallel/ParallelSeries.ts 
b/src/chart/parallel/ParallelSeries.ts
index d98aab0..9f0d6f3 100644
--- a/src/chart/parallel/ParallelSeries.ts
+++ b/src/chart/parallel/ParallelSeries.ts
@@ -29,7 +29,7 @@ export default SeriesModel.extend({
 
     dependencies: ['parallel'],
 
-    visualColorAccessPath: 'lineStyle.color',
+    visualColorAccessPath: ['lineStyle', 'color'],
 
     getInitialData: function (option, ecModel) {
         var source = this.getSource();
diff --git a/src/chart/scatter/ScatterSeries.ts 
b/src/chart/scatter/ScatterSeries.ts
index f5cd3df..b143d3d 100644
--- a/src/chart/scatter/ScatterSeries.ts
+++ b/src/chart/scatter/ScatterSeries.ts
@@ -74,6 +74,7 @@ export interface ScatterSeriesOption extends SeriesOption,
     }
 
     data?: (ScatterDataItemOption | OptionDataValue)[]
+        | ArrayLike<number> // Can be a flattern array
 }
 
 
diff --git a/src/data/Graph.ts b/src/data/Graph.ts
index 6322319..e52e2f2 100644
--- a/src/data/Graph.ts
+++ b/src/data/Graph.ts
@@ -365,14 +365,16 @@ class GraphNode {
     }
 
     // TODO: TYPE Same type with Model#getModel
-    getModel(path?: string | string[]): Model {
+    getModel<T = unknown>(): Model<T>
+    getModel<T = unknown, S extends keyof T= keyof T>(path: S): Model<T[S]>
+    getModel<T = unknown>(path?: string): Model {
         if (this.dataIndex < 0) {
             return;
         }
         var graph = this.hostGraph;
-        var itemModel = graph.data.getItemModel(this.dataIndex);
+        var itemModel = graph.data.getItemModel<T>(this.dataIndex);
 
-        return itemModel.getModel(path as [string]);
+        return itemModel.getModel(path as any);
     }
 }
 
@@ -397,14 +399,16 @@ class GraphEdge {
         this.dataIndex = dataIndex == null ? -1 : dataIndex;
     }
 
-    getModel(path?: string | string[]): Model {
+    getModel<T = unknown>(): Model<T>
+    getModel<T = unknown, S extends keyof T= keyof T>(path: S): Model<T[S]>
+    getModel<T = unknown>(path?: string): Model {
         if (this.dataIndex < 0) {
             return;
         }
         var graph = this.hostGraph;
         var itemModel = graph.edgeData.getItemModel(this.dataIndex);
 
-        return itemModel.getModel(path as [string]);
+        return itemModel.getModel(path as any);
     }
 }
 
diff --git a/src/data/List.ts b/src/data/List.ts
index 37be86c..4cc72de 100644
--- a/src/data/List.ts
+++ b/src/data/List.ts
@@ -35,7 +35,7 @@ import {ArrayLike, Dictionary, FunctionPropertyNames} from 
'zrender/src/core/typ
 import Element from 'zrender/src/Element';
 import {
     DimensionIndex, DimensionName, ECElement, DimensionLoose, OptionDataItem,
-    ParsedValue, ParsedValueNumeric, OrdinalNumber, DimensionUserOuput, 
ModelOption
+    ParsedValue, ParsedValueNumeric, OrdinalNumber, DimensionUserOuput, 
ModelOption, OptionDataValue
 } from '../util/types';
 import {parseDate} from '../util/number';
 import {isDataItemOption} from '../util/model';
@@ -1564,7 +1564,10 @@ class List<HostModel extends Model = Model> {
      * Get model of one data item.
      */
     // TODO: Type of data item
-    getItemModel(idx: number): Model {
+    getItemModel<ItemOpts extends unknown = unknown>(idx: number): 
Model<ItemOpts
+        // Extract item option with value key. FIXME will cause incompatitable 
issue
+        // Extract<HostModel['option']['data'][number], { value?: any }>
+    > {
         var hostModel = this.hostModel;
         var dataItem = this.getRawDataItem(idx) as ModelOption;
         return new Model(dataItem, hostModel, hostModel && hostModel.ecModel);
diff --git a/src/data/Tree.ts b/src/data/Tree.ts
index c9c0e85..2f70196 100644
--- a/src/data/Tree.ts
+++ b/src/data/Tree.ts
@@ -205,7 +205,9 @@ class TreeNode {
     }
 
     // TODO: TYPE Same type with Model#getModel
-    getModel(path: readonly string[] | string) {
+    getModel<T = unknown>(): Model<T>
+    getModel<T = unknown, S extends keyof T= keyof T>(path: S): Model<T[S]>
+    getModel<T = unknown>(path?: string): Model {
         if (this.dataIndex < 0) {
             return;
         }
@@ -217,8 +219,8 @@ class TreeNode {
             leavesModel = this.getLeavesModel();
         }
         return itemModel.getModel(
-            path as [string],
-            (levelModel || leavesModel || hostTree.hostModel).getModel(path as 
[string])
+            path as any,
+            (levelModel || leavesModel || hostTree.hostModel).getModel(path as 
any)
         );
     }
     // TODO: TYPE More specific model
diff --git a/src/model/Series.ts b/src/model/Series.ts
index acb70db..027614c 100644
--- a/src/model/Series.ts
+++ b/src/model/Series.ts
@@ -104,10 +104,10 @@ class SeriesModel<Opt extends SeriesOption = 
SeriesOption> extends ComponentMode
     legendVisualProvider: LegendVisualProvider;
 
     // Access path of color for visual
-    visualColorAccessPath: string;
+    visualColorAccessPath: string[];
 
     // Access path of borderColor for visual
-    visualBorderColorAccessPath: string;
+    visualBorderColorAccessPath: string[];
 
     readonly preventUsingHoverLayer: boolean;
 
@@ -115,8 +115,8 @@ class SeriesModel<Opt extends SeriesOption = SeriesOption> 
extends ComponentMode
         var proto = SeriesModel.prototype;
         proto.type = 'series.__base__';
         proto.seriesIndex = 0;
-        proto.visualColorAccessPath = 'itemStyle.color';
-        proto.visualBorderColorAccessPath = 'itemStyle.borderColor';
+        proto.visualColorAccessPath = ['itemStyle', 'color'];
+        proto.visualBorderColorAccessPath = ['itemStyle', 'borderColor'];
     })();
 
 
diff --git a/src/util/types.ts b/src/util/types.ts
index 6667c53..4497d95 100644
--- a/src/util/types.ts
+++ b/src/util/types.ts
@@ -629,6 +629,8 @@ export interface SymbolOptionMixin<T = unknown> {
 
     symbolRotate?: number
     symbolKeepAspect?: boolean
+
+    symbolOffset?: number[]
 }
 
 /**
@@ -751,7 +753,7 @@ export interface LabelOption extends TextCommonOption {
     // x, y can be both percent string or number px.
     position?: string | (number | string)[]
     distance?: number
-    rotate?: number | boolean
+    rotate?: number
     offset?: number[]
 
     // TODO: TYPE not all label support formatter
diff --git a/src/visual/seriesColor.ts b/src/visual/seriesColor.ts
index f5bd265..5c6009a 100644
--- a/src/visual/seriesColor.ts
+++ b/src/visual/seriesColor.ts
@@ -17,8 +17,6 @@
 * under the License.
 */
 
-// @ts-nocheck
-
 import Gradient from 'zrender/src/graphic/Gradient';
 import {isFunction} from 'zrender/src/core/util';
 import { StageHandler } from '../util/types';
@@ -28,9 +26,10 @@ const seriesColorTask: StageHandler = {
     performRawSeries: true,
     reset: function (seriesModel, ecModel) {
         var data = seriesModel.getData();
-        var colorAccessPath = (seriesModel.visualColorAccessPath || 
'itemStyle.color').split('.');
+        var colorAccessPath = seriesModel.visualColorAccessPath
+            || ['itemStyle', 'color'];
         // Set in itemStyle
-        var color = seriesModel.get(colorAccessPath);
+        var color = seriesModel.get(colorAccessPath as any);
         var colorCallback = (isFunction(color) && !(color instanceof Gradient))
             ? color : null;
         // Default color
@@ -43,8 +42,8 @@ const seriesColorTask: StageHandler = {
 
         data.setVisual('color', color);
 
-        var borderColorAccessPath = (seriesModel.visualBorderColorAccessPath 
|| 'itemStyle.borderColor').split('.');
-        var borderColor = seriesModel.get(borderColorAccessPath);
+        var borderColorAccessPath = seriesModel.visualBorderColorAccessPath || 
['itemStyle', 'borderColor'];
+        var borderColor = seriesModel.get(borderColorAccessPath as any);
         data.setVisual('borderColor', borderColor);
 
         // Only visible series has each data be visual encoded
@@ -57,20 +56,19 @@ const seriesColorTask: StageHandler = {
                 });
             }
 
-            // itemStyle in each data item
-            var dataEach = function (data, idx) {
-                var itemModel = data.getItemModel(idx);
-                var color = itemModel.get(colorAccessPath, true);
-                var borderColor = itemModel.get(borderColorAccessPath, true);
-                if (color != null) {
-                    data.setItemVisual(idx, 'color', color);
-                }
-                if (borderColor != null) {
-                    data.setItemVisual(idx, 'borderColor', borderColor);
-                }
+            return {
+                dataEach: data.hasItemOption ? function (data, idx) {
+                    var itemModel = data.getItemModel(idx);
+                    var color = itemModel.get(colorAccessPath as any, true);
+                    var borderColor = itemModel.get(borderColorAccessPath as 
any, true);
+                    if (color != null) {
+                        data.setItemVisual(idx, 'color', color);
+                    }
+                    if (borderColor != null) {
+                        data.setItemVisual(idx, 'borderColor', borderColor);
+                    }
+                } : null
             };
-
-            return { dataEach: data.hasItemOption ? dataEach : null };
         }
     }
 };


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to