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

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

commit 9d9ffce7efb4576cb65325f24fa650ae636c67b0
Author: 100pah <sushuang0...@gmail.com>
AuthorDate: Sun Jul 26 19:32:17 2020 +0800

    ts: add types to some @ts-nocheck and remove some 'any'.
---
 src/chart/bar/BarView.ts                    |   2 +-
 src/chart/custom.ts                         |   5 +-
 src/chart/funnel/FunnelSeries.ts            |   2 +-
 src/chart/graph/GraphSeries.ts              |  20 +--
 src/chart/helper/createGraphFromNodeEdge.ts |  21 ++-
 src/chart/helper/createListFromArray.ts     |   6 +-
 src/chart/helper/whiskerBoxCommon.ts        |   7 +-
 src/chart/map/MapSeries.ts                  |   2 +-
 src/chart/pie/PieSeries.ts                  |   2 +-
 src/chart/sankey/SankeySeries.ts            |  19 +--
 src/chart/sunburst/SunburstSeries.ts        |   2 +-
 src/component/toolbox/feature/DataView.ts   |   2 +-
 src/component/toolbox/feature/MagicType.ts  |  17 +-
 src/coord/calendar/Calendar.ts              |   2 +-
 src/data/DataDimensionInfo.ts               |   2 +-
 src/data/Graph.ts                           |   2 +-
 src/data/List.ts                            |  23 ++-
 src/data/Source.ts                          |   8 +-
 src/data/helper/completeDimensions.ts       | 100 +++++++----
 src/data/helper/createDimensions.ts         |  22 ++-
 src/data/helper/dimensionHelper.ts          |  23 ++-
 src/data/helper/linkList.ts                 | 119 ++++++++------
 src/data/helper/sourceHelper.ts             | 246 ++++++++++++++++++----------
 src/label/LabelManager.ts                   |   7 +-
 src/model/Series.ts                         |  20 +--
 src/model/mixin/dataFormat.ts               |   9 +-
 src/stream/task.ts                          |   5 +-
 src/util/graphic.ts                         |   5 +-
 src/util/model.ts                           |   2 +-
 src/util/states.ts                          |   8 +-
 src/util/types.ts                           |  72 ++++++--
 31 files changed, 484 insertions(+), 298 deletions(-)

diff --git a/src/chart/bar/BarView.ts b/src/chart/bar/BarView.ts
index eecb05d..f98de86 100644
--- a/src/chart/bar/BarView.ts
+++ b/src/chart/bar/BarView.ts
@@ -787,7 +787,7 @@ function updateStyle(
 
 // In case width or height are too small.
 function getLineWidth(
-    itemModel: Model<BarSeriesOption>,
+    itemModel: Model<BarDataItemOption>,
     rawLayout: RectLayout
 ) {
     const lineWidth = itemModel.get(BAR_BORDER_WIDTH_QUERY) || 0;
diff --git a/src/chart/custom.ts b/src/chart/custom.ts
index e1775f5..b31a4ff 100644
--- a/src/chart/custom.ts
+++ b/src/chart/custom.ts
@@ -50,7 +50,8 @@ import {
     DisplayState,
     ECElement,
     DisplayStateNonNormal,
-    BlurScope
+    BlurScope,
+    SeriesDataType
 } from '../util/types';
 import Element, { ElementProps, ElementTextConfig } from 'zrender/src/Element';
 import prepareCartesian2d from '../coord/cartesian/prepareCustom';
@@ -411,7 +412,7 @@ class CustomSeriesModel extends 
SeriesModel<CustomSeriesOption> {
         return createListFromArray(this.getSource(), this);
     }
 
-    getDataParams(dataIndex: number, dataType?: string, el?: Element): 
CallbackDataParams & {
+    getDataParams(dataIndex: number, dataType?: SeriesDataType, el?: Element): 
CallbackDataParams & {
         info: CustomExtraElementInfo
     } {
         const params = super.getDataParams(dataIndex, dataType) as 
ReturnType<CustomSeriesModel['getDataParams']>;
diff --git a/src/chart/funnel/FunnelSeries.ts b/src/chart/funnel/FunnelSeries.ts
index 15d35c5..bb358b2 100644
--- a/src/chart/funnel/FunnelSeries.ts
+++ b/src/chart/funnel/FunnelSeries.ts
@@ -99,7 +99,7 @@ class FunnelSeriesModel extends 
SeriesModel<FunnelSeriesOption> {
         this._defaultLabelLine(option);
     }
 
-    getInitialData(option: FunnelSeriesOption, ecModel: GlobalModel): List {
+    getInitialData(this: FunnelSeriesModel, option: FunnelSeriesOption, 
ecModel: GlobalModel): List {
         return createListSimply(this, {
             coordDimensions: ['value'],
             encodeDefaulter: zrUtil.curry(makeSeriesEncodeForNameBased, this)
diff --git a/src/chart/graph/GraphSeries.ts b/src/chart/graph/GraphSeries.ts
index 5a7f29c..a72622f 100644
--- a/src/chart/graph/GraphSeries.ts
+++ b/src/chart/graph/GraphSeries.ts
@@ -41,7 +41,9 @@ import {
     LabelFormatterCallback,
     Dictionary,
     LineLabelOption,
-    StatesOptionMixin
+    StatesOptionMixin,
+    GraphEdgeItemObject,
+    OptionDataValueNumeric
 } from '../../util/types';
 import SeriesModel from '../../model/Series';
 import Graph from '../../data/Graph';
@@ -107,16 +109,10 @@ export interface GraphEdgeStateOption {
     lineStyle?: GraphEdgeLineStyleOption
     label?: LineLabelOption
 }
-export interface GraphEdgeItemOption
-    extends GraphEdgeStateOption, StatesOptionMixin<GraphEdgeStateOption, 
ExtraEdgeStateOption> {
-    /**
-     * Name or index of source node.
-     */
-    source?: string | number
-    /**
-     * Name or index of target node.
-     */
-    target?: string | number
+export interface GraphEdgeItemOption extends
+        GraphEdgeStateOption,
+        StatesOptionMixin<GraphEdgeStateOption, ExtraEdgeStateOption>,
+        GraphEdgeItemObject<OptionDataValueNumeric> {
 
     value?: number
 
@@ -272,7 +268,7 @@ class GraphSeriesModel extends 
SeriesModel<GraphSeriesOption> {
         defaultEmphasis(option, 'edgeLabel', ['show']);
     }
 
-    getInitialData(option: GraphSeriesOption, ecModel: GlobalModel) {
+    getInitialData(option: GraphSeriesOption, ecModel: GlobalModel): List {
         const edges = option.edges || option.links || [];
         const nodes = option.data || option.nodes || [];
         const self = this;
diff --git a/src/chart/helper/createGraphFromNodeEdge.ts 
b/src/chart/helper/createGraphFromNodeEdge.ts
index dac9dee..16206de 100644
--- a/src/chart/helper/createGraphFromNodeEdge.ts
+++ b/src/chart/helper/createGraphFromNodeEdge.ts
@@ -17,7 +17,6 @@
 * under the License.
 */
 
-// @ts-nocheck
 
 import * as zrUtil from 'zrender/src/core/util';
 import List from '../../data/List';
@@ -26,8 +25,19 @@ import linkList from '../../data/helper/linkList';
 import createDimensions from '../../data/helper/createDimensions';
 import CoordinateSystem from '../../CoordinateSystem';
 import createListFromArray from './createListFromArray';
+import {
+    OptionSourceDataOriginal, GraphEdgeItemObject, OptionDataValue,
+    OptionDataItemObject
+} from '../../util/types';
+import SeriesModel from '../../model/Series';
 
-export default function (nodes, edges, seriesModel, directed, beforeLink) {
+export default function (
+    nodes: OptionSourceDataOriginal<OptionDataValue, 
OptionDataItemObject<OptionDataValue>>,
+    edges: OptionSourceDataOriginal<OptionDataValue, 
GraphEdgeItemObject<OptionDataValue>>,
+    seriesModel: SeriesModel,
+    directed: boolean,
+    beforeLink: (nodeData: List, edgeData: List) => void
+): Graph {
     // ??? TODO
     // support dataset?
     const graph = new Graph(directed);
@@ -48,7 +58,10 @@ export default function (nodes, edges, seriesModel, 
directed, beforeLink) {
         // addEdge may fail when source or target not exists
         if (graph.addEdge(source, target, linkCount)) {
             validEdges.push(link);
-            linkNameList.push(zrUtil.retrieve(link.id, source + ' > ' + 
target));
+            linkNameList.push(zrUtil.retrieve(
+                link.id != null ? link.id + '' : null,
+                source + ' > ' + target
+            ));
             linkCount++;
         }
     }
@@ -60,7 +73,7 @@ export default function (nodes, edges, seriesModel, directed, 
beforeLink) {
     }
     else {
         const coordSysCtor = CoordinateSystem.get(coordSys);
-        const coordDimensions = (coordSysCtor && coordSysCtor.type !== 'view')
+        const coordDimensions = coordSysCtor
             ? (coordSysCtor.dimensions || []) : [];
         // FIXME: Some geo do not need `value` dimenson, whereas `calendar` 
needs
         // `value` dimension, but graph need `value` dimension. It's better to
diff --git a/src/chart/helper/createListFromArray.ts 
b/src/chart/helper/createListFromArray.ts
index 253240f..e451cd3 100644
--- a/src/chart/helper/createListFromArray.ts
+++ b/src/chart/helper/createListFromArray.ts
@@ -27,10 +27,12 @@ import {getCoordSysInfoBySeries} from 
'../../model/referHelper';
 import Source from '../../data/Source';
 import {enableDataStack} from '../../data/helper/dataStackHelper';
 import {makeSeriesEncodeForAxisCoordSys} from '../../data/helper/sourceHelper';
-import { SOURCE_FORMAT_ORIGINAL, DimensionDefinitionLoose, DimensionDefinition 
} from '../../util/types';
+import {
+    SOURCE_FORMAT_ORIGINAL, DimensionDefinitionLoose, DimensionDefinition, 
OptionSourceData
+} from '../../util/types';
 import SeriesModel from '../../model/Series';
 
-function createListFromArray(source: Source | any[], seriesModel: SeriesModel, 
opt?: {
+function createListFromArray(source: Source | OptionSourceData, seriesModel: 
SeriesModel, opt?: {
     generateCoord?: string
     useEncodeDefaulter?: boolean
 }): List {
diff --git a/src/chart/helper/whiskerBoxCommon.ts 
b/src/chart/helper/whiskerBoxCommon.ts
index 31dcec9..d1f6976 100644
--- a/src/chart/helper/whiskerBoxCommon.ts
+++ b/src/chart/helper/whiskerBoxCommon.ts
@@ -28,6 +28,7 @@ import type CartesianAxisModel from 
'../../coord/cartesian/AxisModel';
 import type DataDimensionInfo from '../../data/DataDimensionInfo';
 import type List from '../../data/List';
 import type Axis2D from '../../coord/cartesian/Axis2D';
+import { CoordDimensionDefinition } from '../../data/helper/createDimensions';
 
 interface CommonOption extends SeriesOption, SeriesOnCartesianOptionMixin {
     layout?: LayoutOrient
@@ -50,7 +51,7 @@ class WhiskerBoxCommonMixin<Opts extends CommonOption> {
      */
     _baseAxisDim: string;
 
-    defaultValueDimensions: Partial<DataDimensionInfo>[];
+    defaultValueDimensions: CoordDimensionDefinition['dimsDef'];
 
     /**
      * @override
@@ -117,7 +118,7 @@ class WhiskerBoxCommonMixin<Opts extends CommonOption> {
         }
 
         const defaultValueDimensions = this.defaultValueDimensions;
-        const coordDimensions = [{
+        const coordDimensions: CoordDimensionDefinition[] = [{
             name: baseAxisDim,
             type: getDimensionTypeByAxis(baseAxisType),
             ordinalMeta: ordinalMeta,
@@ -138,7 +139,7 @@ class WhiskerBoxCommonMixin<Opts extends CommonOption> {
                 coordDimensions: coordDimensions,
                 dimensionsCount: defaultValueDimensions.length + 1,
                 encodeDefaulter: zrUtil.curry(
-                    makeSeriesEncodeForAxisCoordSys, coordDimensions, this
+                    makeSeriesEncodeForAxisCoordSys, coordDimensions, this as 
any
                 )
             }
         );
diff --git a/src/chart/map/MapSeries.ts b/src/chart/map/MapSeries.ts
index 7aae79d..581b2cd 100644
--- a/src/chart/map/MapSeries.ts
+++ b/src/chart/map/MapSeries.ts
@@ -110,7 +110,7 @@ class MapSeries extends SeriesModel<MapSeriesOption> {
     seriesGroup: MapSeries[] = [];
 
 
-    getInitialData(option: MapSeriesOption): List {
+    getInitialData(this: MapSeries, option: MapSeriesOption): List {
         const data = createListSimply(this, {
             coordDimensions: ['value'],
             encodeDefaulter: zrUtil.curry(makeSeriesEncodeForNameBased, this)
diff --git a/src/chart/pie/PieSeries.ts b/src/chart/pie/PieSeries.ts
index de0b77e..f74b045 100644
--- a/src/chart/pie/PieSeries.ts
+++ b/src/chart/pie/PieSeries.ts
@@ -135,7 +135,7 @@ class PieSeriesModel extends SeriesModel<PieSeriesOption> {
     /**
      * @overwrite
      */
-    getInitialData(): List {
+    getInitialData(this: PieSeriesModel): List {
         return createListSimply(this, {
             coordDimensions: ['value'],
             encodeDefaulter: zrUtil.curry(makeSeriesEncodeForNameBased, this)
diff --git a/src/chart/sankey/SankeySeries.ts b/src/chart/sankey/SankeySeries.ts
index 5cd34ea..19c64f6 100644
--- a/src/chart/sankey/SankeySeries.ts
+++ b/src/chart/sankey/SankeySeries.ts
@@ -32,7 +32,9 @@ import {
     LayoutOrient,
     ColorString,
     StatesOptionMixin,
-    OptionDataItemObject
+    OptionDataItemObject,
+    GraphEdgeItemObject,
+    OptionDataValueNumeric
 } from '../../util/types';
 import GlobalModel from '../../model/Global';
 import List from '../../data/List';
@@ -77,17 +79,10 @@ export interface SankeyNodeItemOption extends 
SankeyNodeStateOption,
     focusNodeAdjacency?: FocusNodeAdjacency
 }
 
-export interface SankeyEdgeItemOption
-    extends SankeyEdgeStateOption, StatesOptionMixin<SankeyEdgeStateOption, 
ExtraStateOption> {
-    /**
-     * Name or index of source node.
-     */
-    source?: string | number
-    /**
-     * Name or index of target node.
-     */
-    target?: string | number
-
+export interface SankeyEdgeItemOption extends
+        SankeyEdgeStateOption,
+        StatesOptionMixin<SankeyEdgeStateOption, ExtraStateOption>,
+        GraphEdgeItemObject<OptionDataValueNumeric> {
     focusNodeAdjacency?: FocusNodeAdjacency
 }
 
diff --git a/src/chart/sunburst/SunburstSeries.ts 
b/src/chart/sunburst/SunburstSeries.ts
index dfb922c..fff56bf 100644
--- a/src/chart/sunburst/SunburstSeries.ts
+++ b/src/chart/sunburst/SunburstSeries.ts
@@ -128,7 +128,7 @@ class SunburstSeriesModel extends 
SeriesModel<SunburstSeriesOption> {
 
     getInitialData(option: SunburstSeriesOption, ecModel: GlobalModel) {
         // Create a virtual root.
-        const root = { name: option.name, children: option.data };
+        const root = { name: option.name, children: option.data } as 
SunburstSeriesNodeItemOption;
 
         completeTreeValue(root);
 
diff --git a/src/component/toolbox/feature/DataView.ts 
b/src/component/toolbox/feature/DataView.ts
index 690f7d4..44ca225 100644
--- a/src/component/toolbox/feature/DataView.ts
+++ b/src/component/toolbox/feature/DataView.ts
@@ -485,7 +485,7 @@ echarts.registerAction({
             const originalData = seriesModel.get('data');
             newSeriesOptList.push({
                 name: seriesOpt.name,
-                data: tryMergeDataOption(seriesOpt.data, originalData)
+                data: tryMergeDataOption(seriesOpt.data as DataList, 
originalData as DataList)
             });
         }
     });
diff --git a/src/component/toolbox/feature/MagicType.ts 
b/src/component/toolbox/feature/MagicType.ts
index b5b3e0f..cc8a82f 100644
--- a/src/component/toolbox/feature/MagicType.ts
+++ b/src/component/toolbox/feature/MagicType.ts
@@ -100,7 +100,7 @@ class MagicType extends 
ToolboxFeature<ToolboxMagicTypeFeatureOption> {
         const newOption: ECUnitOption = {
             series: []
         };
-        const generateNewSeriesTypes = function (seriesModel: SeriesModel) {
+        const generateNewSeriesTypes = function (seriesModel: 
SeriesModel<MegicTypeSeriesOption>) {
             const seriesType = seriesModel.subType;
             const seriesId = seriesModel.id;
             const newSeriesOpt = seriesOptGenreator[type](
@@ -170,17 +170,18 @@ class MagicType extends 
ToolboxFeature<ToolboxMagicTypeFeatureOption> {
     }
 }
 
+type MegicTypeSeriesOption = SeriesOption & {
+    // TODO: TYPE More specified series option
+    stack?: boolean | string
+    data?: unknown[]
+    markPoint?: unknown
+    markLine?: unknown
+};
 
 type SeriesOptGenreator = (
     seriesType: string,
     seriesId: string,
-    seriesModel: SeriesModel<SeriesOption & {
-        // TODO: TYPE More specified series option
-        stack?: boolean | string
-        data?: any[]
-        markPoint?: any
-        markLine?: any
-    }>,
+    seriesModel: SeriesModel<MegicTypeSeriesOption>,
     model: ToolboxFeatureModel<ToolboxMagicTypeFeatureOption>
 ) => SeriesOption;
 
diff --git a/src/coord/calendar/Calendar.ts b/src/coord/calendar/Calendar.ts
index ae23233..f75a40b 100644
--- a/src/coord/calendar/Calendar.ts
+++ b/src/coord/calendar/Calendar.ts
@@ -98,7 +98,7 @@ class Calendar implements CoordinateSystem, 
CoordinateSystemMaster {
     static readonly dimensions = ['time', 'value'];
     static getDimensionsInfo() {
         return [{
-            name: 'time', type: 'time'
+            name: 'time', type: 'time' as const
         }, 'value'];
     }
 
diff --git a/src/data/DataDimensionInfo.ts b/src/data/DataDimensionInfo.ts
index bfe27dc..e2f3e02 100644
--- a/src/data/DataDimensionInfo.ts
+++ b/src/data/DataDimensionInfo.ts
@@ -126,7 +126,7 @@ class DataDimensionInfo {
     /**
      * @param opt All of the fields will be shallow copied.
      */
-    constructor(opt: object | DataDimensionInfo) {
+    constructor(opt?: object | DataDimensionInfo) {
         if (opt != null) {
             zrUtil.extend(this, opt);
         }
diff --git a/src/data/Graph.ts b/src/data/Graph.ts
index 164fe27..684927f 100644
--- a/src/data/Graph.ts
+++ b/src/data/Graph.ts
@@ -68,7 +68,7 @@ class Graph {
     /**
      * Add a new node
      */
-    addNode(id: string, dataIndex?: number): GraphNode {
+    addNode(id: string | number, dataIndex?: number): GraphNode {
         id = id == null ? ('' + dataIndex) : ('' + id);
 
         const nodesMap = this._nodesMap;
diff --git a/src/data/List.ts b/src/data/List.ts
index a1ad1db..daa14cb 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, DimensionLoose, OptionDataItem,
-    ParsedValue, ParsedValueNumeric, OrdinalNumber, DimensionUserOuput, 
ModelOption
+    ParsedValue, ParsedValueNumeric, OrdinalNumber, DimensionUserOuput, 
ModelOption, SeriesDataType
 } from '../util/types';
 import {parseDate} from '../util/number';
 import {isDataItemOption} from '../util/model';
@@ -180,16 +180,22 @@ class List<
 
     readonly hostModel: HostModel;
 
-    readonly dataType: string;
+    /**
+     * @readonly
+     */
+    dataType: SeriesDataType;
 
     /**
+     * @readonly
      * Host graph if List is used to store graph nodes / edges.
      */
-    readonly graph?: Graph;
+    graph?: Graph;
+
     /**
+     * @readonly
      * Host tree if List is used to store tree ndoes.
      */
-    readonly tree?: Tree;
+    tree?: Tree;
 
     // Indices stores the indices of data subset after filtered.
     // This data subset will be used in chart.
@@ -267,9 +273,9 @@ class List<
 
     // Methods that create a new list based on this list should be listed here.
     // Notice that those method should `RETURN` the new list.
-    TRANSFERABLE_METHODS = ['cloneShallow', 'downSample', 'map'];
+    TRANSFERABLE_METHODS = ['cloneShallow', 'downSample', 'map'] as const;
     // Methods that change indices of this list should be listed here.
-    CHANGABLE_METHODS = ['filterSelf', 'selectRange'];
+    CHANGABLE_METHODS = ['filterSelf', 'selectRange'] as const;
 
 
     /**
@@ -2190,4 +2196,9 @@ class List<
 
 }
 
+interface List {
+    getLinkedData(dataType?: SeriesDataType): List;
+    getLinkedDataAll(): { data: List, type?: SeriesDataType }[];
+}
+
 export default List;
diff --git a/src/data/Source.ts b/src/data/Source.ts
index 0bc561c..10d62af 100644
--- a/src/data/Source.ts
+++ b/src/data/Source.ts
@@ -25,7 +25,8 @@ import {
     SERIES_LAYOUT_BY_COLUMN,
     SOURCE_FORMAT_UNKNOWN,
     SOURCE_FORMAT_KEYED_COLUMNS,
-    SOURCE_FORMAT_TYPED_ARRAY
+    SOURCE_FORMAT_TYPED_ARRAY,
+    DimensionName
 } from '../util/types';
 
 /**
@@ -97,7 +98,7 @@ class Source {
      * can be null/undefined.
      * Might be specified outside.
      */
-    encodeDefine: HashMap<OptionEncodeValue>;
+    encodeDefine: HashMap<OptionEncodeValue, DimensionName>;
 
     /**
      * Not null/undefined, uint.
@@ -128,7 +129,8 @@ class Source {
         this.sourceFormat = fields.sourceFormat || SOURCE_FORMAT_UNKNOWN;
         this.seriesLayoutBy = fields.seriesLayoutBy || SERIES_LAYOUT_BY_COLUMN;
         this.dimensionsDefine = fields.dimensionsDefine;
-        this.encodeDefine = fields.encodeDefine && 
createHashMap(fields.encodeDefine);
+        this.encodeDefine = fields.encodeDefine
+            && createHashMap<OptionEncodeValue, 
DimensionName>(fields.encodeDefine);
         this.startIndex = fields.startIndex || 0;
         this.dimensionsDetectCount = fields.dimensionsDetectCount;
     }
diff --git a/src/data/helper/completeDimensions.ts 
b/src/data/helper/completeDimensions.ts
index 904c7a7..25e6568 100644
--- a/src/data/helper/completeDimensions.ts
+++ b/src/data/helper/completeDimensions.ts
@@ -17,18 +17,22 @@
 * under the License.
 */
 
-// @ts-nocheck
 /**
  * @deprecated
  * Use `echarts/data/helper/createDimensions` instead.
  */
 
-import {createHashMap, each, isString, defaults, extend, isObject, clone} from 
'zrender/src/core/util';
+import {createHashMap, each, isString, defaults, extend, isObject, clone, 
HashMap} from 'zrender/src/core/util';
 import {normalizeToArray} from '../../util/model';
 import {guessOrdinal, BE_ORDINAL} from './sourceHelper';
 import Source from '../Source';
-import {VISUAL_DIMENSIONS} from '../../util/types';
+import {
+    VISUAL_DIMENSIONS, DimensionDefinitionLoose, OptionSourceData,
+    EncodeDefaulter, OptionEncodeValue, OptionEncode, DimensionName, 
DimensionIndex, DataVisualDimensions
+} from '../../util/types';
 import DataDimensionInfo from '../DataDimensionInfo';
+import List from '../List';
+import { CoordDimensionDefinition, CoordDimensionDefinitionLoose } from 
'./createDimensions';
 
 /**
  * @see {module:echarts/test/ut/spec/data/completeDimensions}
@@ -69,25 +73,37 @@ import DataDimensionInfo from '../DataDimensionInfo';
  * @param {number} [opt.dimCount] If not specified, guess by the first data 
item.
  * @return {Array.<module:data/DataDimensionInfo>}
  */
-function completeDimensions(sysDims, source, opt) {
+function completeDimensions(
+    sysDims: CoordDimensionDefinitionLoose[],
+    source: Source | List | OptionSourceData,
+    opt: {
+        dimsDef?: DimensionDefinitionLoose[];
+        encodeDef?: HashMap<OptionEncodeValue, DimensionName> | OptionEncode;
+        dimCount?: number;
+        encodeDefaulter?: EncodeDefaulter;
+        generateCoord?: string;
+        generateCoordCount?: number;
+    }
+): DataDimensionInfo[] {
     if (!(source instanceof Source)) {
-        source = Source.seriesDataToSource(source);
+        source = Source.seriesDataToSource(source as OptionSourceData);
     }
 
     opt = opt || {};
     sysDims = (sysDims || []).slice();
     const dimsDef = (opt.dimsDef || []).slice();
-    const dataDimNameMap = createHashMap();
-    const coordDimNameMap = createHashMap();
+    const dataDimNameMap = createHashMap<DimensionIndex, DimensionName>();
+    const coordDimNameMap = createHashMap<true, DimensionName>();
     // let valueCandidate;
-    const result = [];
+    const result: DataDimensionInfo[] = [];
 
     const dimCount = getDimCount(source, sysDims, dimsDef, opt.dimCount);
 
     // Apply user defined dims (`name` and `type`) and init result.
     for (let i = 0; i < dimCount; i++) {
+        const dimDefItemRaw = dimsDef[i];
         const dimDefItem = dimsDef[i] = extend(
-            {}, isObject(dimsDef[i]) ? dimsDef[i] : {name: dimsDef[i]}
+            {}, isObject(dimDefItemRaw) ? dimDefItemRaw : { name: 
dimDefItemRaw }
         );
         const userDimName = dimDefItem.name;
         const resultItem = result[i] = new DataDimensionInfo();
@@ -107,24 +123,26 @@ function completeDimensions(sysDims, source, opt) {
     if (!encodeDef && opt.encodeDefaulter) {
         encodeDef = opt.encodeDefaulter(source, dimCount);
     }
-    encodeDef = createHashMap(encodeDef);
+    const encodeDefMap = createHashMap<DimensionIndex[] | false, 
DimensionName>(encodeDef as any);
 
-    // Set `coordDim` and `coordDimIndex` by `encodeDef` and normalize 
`encodeDef`.
-    encodeDef.each(function (dataDims, coordDim) {
-        dataDims = normalizeToArray(dataDims).slice();
+    // Set `coordDim` and `coordDimIndex` by `encodeDefMap` and normalize 
`encodeDefMap`.
+    encodeDefMap.each(function (dataDimsRaw, coordDim) {
+        const dataDims = normalizeToArray(dataDimsRaw as []).slice();
 
         // Note: It is allowed that `dataDims.length` is `0`, e.g., options is
         // `{encode: {x: -1, y: 1}}`. Should not filter anything in
         // this case.
         if (dataDims.length === 1 && !isString(dataDims[0]) && dataDims[0] < 
0) {
-            encodeDef.set(coordDim, false);
+            encodeDefMap.set(coordDim, false);
             return;
         }
 
-        const validDataDims = encodeDef.set(coordDim, []);
-        each(dataDims, function (resultDimIdx, idx) {
+        const validDataDims = encodeDefMap.set(coordDim, []) as 
DimensionIndex[];
+        each(dataDims, function (resultDimIdxOrName, idx) {
             // The input resultDimIdx can be dim name or index.
-            isString(resultDimIdx) && (resultDimIdx = 
dataDimNameMap.get(resultDimIdx));
+            const resultDimIdx = isString(resultDimIdxOrName)
+                ? dataDimNameMap.get(resultDimIdxOrName)
+                : resultDimIdxOrName;
             if (resultDimIdx != null && resultDimIdx < dimCount) {
                 validDataDims[idx] = resultDimIdx;
                 applyDim(result[resultDimIdx], coordDim, idx);
@@ -134,15 +152,17 @@ function completeDimensions(sysDims, source, opt) {
 
     // Apply templetes and default order from `sysDims`.
     let availDimIdx = 0;
-    each(sysDims, function (sysDimItem, sysDimIndex) {
-        let coordDim;
-        let sysDimItemDimsDef;
-        let sysDimItemOtherDims;
-        if (isString(sysDimItem)) {
-            coordDim = sysDimItem;
-            sysDimItem = {};
+    each(sysDims, function (sysDimItemRaw) {
+        let coordDim: DimensionName;
+        let sysDimItemDimsDef: CoordDimensionDefinition['dimsDef'];
+        let sysDimItemOtherDims: CoordDimensionDefinition['otherDims'];
+        let sysDimItem: CoordDimensionDefinition;
+        if (isString(sysDimItemRaw)) {
+            coordDim = sysDimItemRaw;
+            sysDimItem = {} as CoordDimensionDefinition;
         }
         else {
+            sysDimItem = sysDimItemRaw;
             coordDim = sysDimItem.name;
             const ordinalMeta = sysDimItem.ordinalMeta;
             sysDimItem.ordinalMeta = null;
@@ -155,7 +175,7 @@ function completeDimensions(sysDims, source, opt) {
                 sysDimItem.dimsDef = sysDimItem.otherDims = null;
         }
 
-        let dataDims = encodeDef.get(coordDim);
+        let dataDims = encodeDefMap.get(coordDim);
 
         // negative resultDimIdx means no need to mapping.
         if (dataDims === false) {
@@ -189,9 +209,9 @@ function completeDimensions(sysDims, source, opt) {
         });
     });
 
-    function applyDim(resultItem, coordDim, coordDimIndex) {
-        if (VISUAL_DIMENSIONS.get(coordDim) != null) {
-            resultItem.otherDims[coordDim] = coordDimIndex;
+    function applyDim(resultItem: DataDimensionInfo, coordDim: DimensionName, 
coordDimIndex: DimensionIndex) {
+        if (VISUAL_DIMENSIONS.get(coordDim as keyof DataVisualDimensions) != 
null) {
+            resultItem.otherDims[coordDim as keyof DataVisualDimensions] = 
coordDimIndex;
         }
         else {
             resultItem.coordDim = coordDim;
@@ -224,13 +244,12 @@ function completeDimensions(sysDims, source, opt) {
         }
 
         resultItem.name == null && (resultItem.name = genName(
-            resultItem.coordDim,
-            dataDimNameMap
+            resultItem.coordDim, dataDimNameMap, false
         ));
 
         if (resultItem.type == null
             && (
-                guessOrdinal(source, resultDimIdx, resultItem.name) === 
BE_ORDINAL.Must
+                guessOrdinal(source, resultDimIdx) === BE_ORDINAL.Must
                 // Consider the case:
                 // {
                 //    dataset: {source: [
@@ -267,7 +286,12 @@ function completeDimensions(sysDims, source, opt) {
 // (2) sometimes user need to calcualte bubble size or use visualMap
 // on other dimensions besides coordSys needed.
 // So, dims that is not used by system, should be shared in storage?
-function getDimCount(source, sysDims, dimsDef, optDimCount) {
+function getDimCount(
+    source: Source,
+    sysDims: CoordDimensionDefinitionLoose[],
+    dimsDef: DimensionDefinitionLoose[],
+    optDimCount: number
+): number {
     // Note that the result dimCount should not small than columns count
     // of data, otherwise `dataDimNameMap` checking will be incorrect.
     let dimCount = Math.max(
@@ -277,13 +301,19 @@ function getDimCount(source, sysDims, dimsDef, 
optDimCount) {
         optDimCount || 0
     );
     each(sysDims, function (sysDimItem) {
-        const sysDimItemDimsDef = sysDimItem.dimsDef;
-        sysDimItemDimsDef && (dimCount = Math.max(dimCount, 
sysDimItemDimsDef.length));
+        let sysDimItemDimsDef;
+        if (isObject(sysDimItem) && (sysDimItemDimsDef = sysDimItem.dimsDef)) {
+            dimCount = Math.max(dimCount, sysDimItemDimsDef.length);
+        }
     });
     return dimCount;
 }
 
-function genName(name, map, fromZero) {
+function genName(
+    name: DimensionName,
+    map: HashMap<unknown, DimensionName>,
+    fromZero: boolean
+): DimensionName {
     if (fromZero || map.get(name) != null) {
         let i = 0;
         while (map.get(name + i) != null) {
diff --git a/src/data/helper/createDimensions.ts 
b/src/data/helper/createDimensions.ts
index 770bfd6..f3cd936 100644
--- a/src/data/helper/createDimensions.ts
+++ b/src/data/helper/createDimensions.ts
@@ -22,16 +22,30 @@
  * `completeDimensions` is to be deprecated.
  */
 import completeDimensions from './completeDimensions';
-import { DimensionDefinitionLoose, OptionEncode, OptionEncodeValue, 
EncodeDefaulter } from '../../util/types';
+import {
+    DimensionDefinitionLoose, OptionEncode, OptionEncodeValue,
+    EncodeDefaulter, OptionSourceData, DimensionName, DimensionDefinition, 
DataVisualDimensions, DimensionIndex
+} from '../../util/types';
 import Source from '../Source';
 import List from '../List';
 import DataDimensionInfo from '../DataDimensionInfo';
 import { HashMap } from 'zrender/src/core/util';
+import OrdinalMeta from '../OrdinalMeta';
+
+
+export interface CoordDimensionDefinition extends DimensionDefinition {
+    dimsDef?: (DimensionName | { name: DimensionName, defaultTooltip?: boolean 
})[];
+    otherDims?: DataVisualDimensions;
+    ordinalMeta?: OrdinalMeta;
+    coordDim?: DimensionName;
+    coordDimIndex?: DimensionIndex;
+}
+export type CoordDimensionDefinitionLoose = CoordDimensionDefinition['name'] | 
CoordDimensionDefinition;
 
 export type CreateDimensionsParams = {
-    coordDimensions?: DimensionDefinitionLoose[],
+    coordDimensions?: CoordDimensionDefinitionLoose[],
     dimensionsDefine?: DimensionDefinitionLoose[],
-    encodeDefine?: HashMap<OptionEncodeValue> | OptionEncode,
+    encodeDefine?: HashMap<OptionEncodeValue, DimensionName> | OptionEncode,
     dimensionsCount?: number,
     encodeDefaulter?: EncodeDefaulter,
     generateCoord?: string,
@@ -46,7 +60,7 @@ export type CreateDimensionsParams = {
  */
 export default function (
     // TODO: TYPE completeDimensions type
-    source: Source | List | any[],
+    source: Source | List | OptionSourceData,
     opt?: CreateDimensionsParams
 ): DataDimensionInfo[] {
     opt = opt || {};
diff --git a/src/data/helper/dimensionHelper.ts 
b/src/data/helper/dimensionHelper.ts
index 245f545..955a3d0 100644
--- a/src/data/helper/dimensionHelper.ts
+++ b/src/data/helper/dimensionHelper.ts
@@ -17,13 +17,12 @@
 * under the License.
 */
 
-// @ts-nocheck
 
 import {each, createHashMap, assert} from 'zrender/src/core/util';
 import { __DEV__ } from '../../config';
-import List from '../List';
+import List, { ListDimensionType } from '../List';
 import {
-    DimensionName, VISUAL_DIMENSIONS, DimensionType, DimensionUserOuput
+    DimensionName, VISUAL_DIMENSIONS, DimensionType, DimensionUserOuput, 
DimensionUserOuputEncode, DimensionIndex
 } from '../../util/types';
 
 export type DimensionSummaryEncode = {
@@ -45,9 +44,9 @@ export type DimensionSummary = {
 export function summarizeDimensions(data: List): DimensionSummary {
     const summary: DimensionSummary = {} as DimensionSummary;
     const encode = summary.encode = {} as DimensionSummaryEncode;
-    const notExtraCoordDimMap = createHashMap();
-    let defaultedLabel = [];
-    let defaultedTooltip = [];
+    const notExtraCoordDimMap = createHashMap<1, DimensionName>();
+    let defaultedLabel = [] as DimensionName[];
+    let defaultedTooltip = [] as DimensionName[];
 
     // See the comment of `List.js#userOutput`.
     const userOutput = summary.userOutput = {
@@ -61,7 +60,7 @@ export function summarizeDimensions(data: List): 
DimensionSummary {
         const coordDim = dimItem.coordDim;
         if (coordDim) {
             if (__DEV__) {
-                assert(VISUAL_DIMENSIONS.get(coordDim) == null);
+                assert(VISUAL_DIMENSIONS.get(coordDim as any) == null);
             }
 
             const coordDimIndex = dimItem.coordDimIndex;
@@ -97,8 +96,8 @@ export function summarizeDimensions(data: List): 
DimensionSummary {
         });
     });
 
-    let dataDimsOnCoord = [];
-    const encodeFirstDimNotExtra = {};
+    let dataDimsOnCoord = [] as DimensionName[];
+    const encodeFirstDimNotExtra = {} as {[coordDim: string]: DimensionName};
 
     notExtraCoordDimMap.each(function (v, coordDim) {
         const dimArr = encode[coordDim];
@@ -136,8 +135,8 @@ export function summarizeDimensions(data: List): 
DimensionSummary {
 }
 
 function getOrCreateEncodeArr(
-    encode: DimensionSummaryEncode, dim: DimensionName
-): DimensionName[] {
+    encode: DimensionSummaryEncode | DimensionUserOuputEncode, dim: 
DimensionName
+): (DimensionIndex | DimensionName)[] {
     if (!encode.hasOwnProperty(dim)) {
         encode[dim] = [];
     }
@@ -145,7 +144,7 @@ function getOrCreateEncodeArr(
 }
 
 // FIXME:TS should be type `AxisType`
-export function getDimensionTypeByAxis(axisType: string) {
+export function getDimensionTypeByAxis(axisType: string): ListDimensionType {
     return axisType === 'category'
         ? 'ordinal'
         : axisType === 'time'
diff --git a/src/data/helper/linkList.ts b/src/data/helper/linkList.ts
index c2ced47..a7cecc4 100644
--- a/src/data/helper/linkList.ts
+++ b/src/data/helper/linkList.ts
@@ -17,18 +17,28 @@
 * under the License.
 */
 
-// @ts-nocheck
 
 /**
  * Link lists and struct (graph or tree)
  */
 
-import * as zrUtil from 'zrender/src/core/util';
+import { curry, each, assert, extend, map, keys } from 'zrender/src/core/util';
+import List from '../List';
+import { makeInner } from '../../util/model';
+import { SeriesDataType } from '../../util/types';
 
-const each = zrUtil.each;
+// That is: { dataType: data },
+// like: { node: nodeList, edge: edgeList }.
+// Should contain mainData.
+type Datas = { [key in SeriesDataType]?: List };
+type StructReferDataAttr = 'data' | 'edgeData';
+type StructAttr = 'tree' | 'graph';
+
+const inner = makeInner<{
+    datas: Datas;
+    mainData: List;
+}, List>();
 
-const DATAS = '\0__link_datas';
-const MAIN_DATA = '\0__link_mainData';
 
 // Caution:
 // In most case, either list or its shallow clones (see list.cloneShallow)
@@ -37,75 +47,79 @@ const MAIN_DATA = '\0__link_mainData';
 // But in some rare case, we have to keep old list (like do animation in 
chart). So
 // please take care that both the old list and the new list share the same 
tree/graph.
 
-/**
- * @param {Object} opt
- * @param {module:echarts/data/List} opt.mainData
- * @param {Object} [opt.struct] For example, instance of Graph or Tree.
- * @param {string} [opt.structAttr] designation: list[structAttr] = struct;
- * @param {Object} [opt.datas] {dataType: data},
- *                 like: {node: nodeList, edge: edgeList}.
- *                 Should contain mainData.
- * @param {Object} [opt.datasAttr] {dataType: attr},
- *                 designation: struct[datasAttr[dataType]] = list;
- */
-function linkList(opt) {
+type LinkListOpt = {
+    mainData: List;
+    // For example, instance of Graph or Tree.
+    struct: {
+        update: () => void;
+    } & {
+        [key in StructReferDataAttr]?: List
+    };
+    // Will designate: `mainData[structAttr] = struct;`
+    structAttr: StructAttr;
+    datas?: Datas;
+    // { dataType: attr },
+    // Will designate: `struct[datasAttr[dataType]] = list;`
+    datasAttr?: { [key in SeriesDataType]?: StructReferDataAttr };
+};
+
+function linkList(opt: LinkListOpt): void {
     const mainData = opt.mainData;
     let datas = opt.datas;
 
     if (!datas) {
-        datas = {main: mainData};
-        opt.datasAttr = {main: 'data'};
+        datas = { main: mainData };
+        opt.datasAttr = { main: 'data' };
     }
     opt.datas = opt.mainData = null;
 
     linkAll(mainData, datas, opt);
 
     // Porxy data original methods.
-    each(datas, function (data) {
+    each(datas, function (data: List) {
         each(mainData.TRANSFERABLE_METHODS, function (methodName) {
-            data.wrapMethod(methodName, zrUtil.curry(transferInjection, opt));
+            data.wrapMethod(methodName, curry(transferInjection, opt));
         });
-
     });
 
     // Beyond transfer, additional features should be added to `cloneShallow`.
-    mainData.wrapMethod('cloneShallow', zrUtil.curry(cloneShallowInjection, 
opt));
+    mainData.wrapMethod('cloneShallow', curry(cloneShallowInjection, opt));
 
     // Only mainData trigger change, because struct.update may trigger
     // another changable methods, which may bring about dead lock.
     each(mainData.CHANGABLE_METHODS, function (methodName) {
-        mainData.wrapMethod(methodName, zrUtil.curry(changeInjection, opt));
+        mainData.wrapMethod(methodName, curry(changeInjection, opt));
     });
 
     // Make sure datas contains mainData.
-    zrUtil.assert(datas[mainData.dataType] === mainData);
+    assert(datas[mainData.dataType] === mainData);
 }
 
-function transferInjection(opt, res) {
+function transferInjection(this: List, opt: LinkListOpt, res: List): unknown {
     if (isMainData(this)) {
         // Transfer datas to new main data.
-        const datas = zrUtil.extend({}, this[DATAS]);
+        const datas = extend({}, inner(this).datas);
         datas[this.dataType] = res;
         linkAll(res, datas, opt);
     }
     else {
         // Modify the reference in main data to point newData.
-        linkSingle(res, this.dataType, this[MAIN_DATA], opt);
+        linkSingle(res, this.dataType, inner(this).mainData, opt);
     }
     return res;
 }
 
-function changeInjection(opt, res) {
-    opt.struct && opt.struct.update(this);
+function changeInjection(opt: LinkListOpt, res: unknown): unknown {
+    opt.struct && opt.struct.update();
     return res;
 }
 
-function cloneShallowInjection(opt, res) {
+function cloneShallowInjection(opt: LinkListOpt, res: List): List {
     // cloneShallow, which brings about some fragilities, may be inappropriate
     // to be exposed as an API. So for implementation simplicity we can make
     // the restriction that cloneShallow of not-mainData should not be invoked
     // outside, but only be invoked here.
-    each(res[DATAS], function (data, dataType) {
+    each(inner(res).datas, function (data: List, dataType) {
         data !== res && linkSingle(data.cloneShallow(), dataType, res, opt);
     });
     return res;
@@ -115,49 +129,52 @@ function cloneShallowInjection(opt, res) {
  * Supplement method to List.
  *
  * @public
- * @param {string} [dataType] If not specified, return mainData.
- * @return {module:echarts/data/List}
+ * @param [dataType] If not specified, return mainData.
  */
-function getLinkedData(dataType) {
-    const mainData = this[MAIN_DATA];
+function getLinkedData(this: List, dataType?: SeriesDataType): List {
+    const mainData = inner(this).mainData;
     return (dataType == null || mainData == null)
         ? mainData
-        : mainData[DATAS][dataType];
+        : inner(mainData).datas[dataType];
 }
 
 /**
  * Get list of all linked data
  */
-function getLinkedDataAll() {
-    const mainData = this[MAIN_DATA];
+function getLinkedDataAll(this: List): {
+    data: List,
+    type?: SeriesDataType
+}[] {
+    const mainData = inner(this).mainData;
     return (mainData == null)
         ? [{ data: mainData }]
-        : zrUtil.map(zrUtil.keys(mainData[DATAS]), function (type) {
+        : map(keys(inner(mainData).datas), function (type) {
             return {
                 type,
-                data: mainData[DATAS][type]
+                data: inner(mainData).datas[type]
             };
         });
 }
 
-function isMainData(data) {
-    return data[MAIN_DATA] === data;
+function isMainData(data: List): boolean {
+    return inner(data).mainData === data;
 }
 
-function linkAll(mainData, datas, opt) {
-    mainData[DATAS] = {};
-    each(datas, function (data, dataType) {
+function linkAll(mainData: List, datas: Datas, opt: LinkListOpt): void {
+    inner(mainData).datas = {};
+    each(datas, function (data: List, dataType) {
         linkSingle(data, dataType, mainData, opt);
     });
 }
 
-function linkSingle(data, dataType, mainData, opt) {
-    mainData[DATAS][dataType] = data;
-    data[MAIN_DATA] = mainData;
+function linkSingle(data: List, dataType: SeriesDataType, mainData: List, opt: 
LinkListOpt): void {
+    inner(mainData).datas[dataType] = data;
+    inner(data).mainData = mainData;
+
     data.dataType = dataType;
 
     if (opt.struct) {
-        data[opt.structAttr] = opt.struct;
+        data[opt.structAttr] = opt.struct as any;
         opt.struct[opt.datasAttr[dataType]] = data;
     }
 
@@ -166,4 +183,4 @@ function linkSingle(data, dataType, mainData, opt) {
     data.getLinkedDataAll = getLinkedDataAll;
 }
 
-export default linkList;
\ No newline at end of file
+export default linkList;
diff --git a/src/data/helper/sourceHelper.ts b/src/data/helper/sourceHelper.ts
index fc760d8..45d1c10 100644
--- a/src/data/helper/sourceHelper.ts
+++ b/src/data/helper/sourceHelper.ts
@@ -17,7 +17,6 @@
 * under the License.
 */
 
-// @ts-nocheck
 
 import {__DEV__} from '../../config';
 import {makeInner, getDataItemValue} from '../../util/model';
@@ -31,7 +30,9 @@ import {
     isTypedArray,
     isArrayLike,
     extend,
-    assert
+    assert,
+    hasOwn,
+    HashMap
 } from 'zrender/src/core/util';
 import Source from '../Source';
 
@@ -42,8 +43,29 @@ import {
     SERIES_LAYOUT_BY_ROW,
     SOURCE_FORMAT_KEYED_COLUMNS,
     SOURCE_FORMAT_TYPED_ARRAY,
-    SOURCE_FORMAT_UNKNOWN
+    SOURCE_FORMAT_UNKNOWN,
+    SourceFormat,
+    Dictionary,
+    SeriesEncodeOptionMixin,
+    SeriesOption,
+    OptionSourceData,
+    SeriesLayoutBy,
+    OptionSourceHeader,
+    DimensionName,
+    DimensionDefinition,
+    DimensionDefinitionLoose,
+    OptionSourceDataArrayRows,
+    OptionDataValue,
+    OptionSourceDataKeyedColumns,
+    OptionSourceDataOriginal,
+    OptionSourceDataObjectRows,
+    OptionEncode,
+    DimensionIndex
 } from '../../util/types';
+import { DatasetModel } from '../../component/dataset';
+import SeriesModel from '../../model/Series';
+import GlobalModel from '../../model/Global';
+import { CoordDimensionDefinition } from './createDimensions';
 
 // The result of `guessOrdinal`.
 export const BE_ORDINAL = {
@@ -51,17 +73,33 @@ export const BE_ORDINAL = {
     Might: 2, // Encounter string but number-like.
     Not: 3 // Other cases
 };
+type BeOrdinalValue = (typeof BE_ORDINAL)[keyof typeof BE_ORDINAL];
+
+const innerDatasetModel = makeInner<{
+    sourceFormat: SourceFormat;
+}, DatasetModel>();
+const innerSeriesModel = makeInner<{
+    source: Source;
+}, SeriesModel>();
+const innerGlobalModel = makeInner<{
+    datasetMap: HashMap<DatasetRecord, string>
+}, GlobalModel>();
+
+interface DatasetRecord {
+    categoryWayDim: number;
+    valueWayDim: number;
+}
 
-const inner = makeInner();
+type SeriesEncodeInternal = {
+    [key in keyof OptionEncode]: DimensionIndex[];
+};
 
-/**
- * @see {module:echarts/data/Source}
- * @param {module:echarts/component/dataset/DatasetModel} datasetModel
- * @return {string} sourceFormat
- */
-export function detectSourceFormat(datasetModel) {
+type SeriesEncodableModel = SeriesModel<SeriesOption & 
SeriesEncodeOptionMixin>;
+
+
+export function detectSourceFormat(datasetModel: DatasetModel): void {
     const data = datasetModel.option.source;
-    let sourceFormat = SOURCE_FORMAT_UNKNOWN;
+    let sourceFormat: SourceFormat = SOURCE_FORMAT_UNKNOWN;
 
     if (isTypedArray(data)) {
         sourceFormat = SOURCE_FORMAT_TYPED_ARRAY;
@@ -90,7 +128,7 @@ export function detectSourceFormat(datasetModel) {
     }
     else if (isObject(data)) {
         for (const key in data) {
-            if (data.hasOwnProperty(key) && isArrayLike(data[key])) {
+            if (hasOwn(data, key) && isArrayLike((data as 
Dictionary<unknown>)[key])) {
                 sourceFormat = SOURCE_FORMAT_KEYED_COLUMNS;
                 break;
             }
@@ -100,7 +138,7 @@ export function detectSourceFormat(datasetModel) {
         throw new Error('Invalid data');
     }
 
-    inner(datasetModel).sourceFormat = sourceFormat;
+    innerDatasetModel(datasetModel).sourceFormat = sourceFormat;
 }
 
 /**
@@ -124,19 +162,17 @@ export function detectSourceFormat(datasetModel) {
  *     }]
  *
  * Get data from series itself or datset.
- * @return {module:echarts/data/Source} source
  */
-export function getSource(seriesModel) {
-    return inner(seriesModel).source;
+export function getSource(seriesModel: SeriesModel): Source {
+    return innerSeriesModel(seriesModel).source;
 }
 
 /**
  * MUST be called before mergeOption of all series.
- * @param {module:echarts/model/Global} ecModel
  */
-export function resetSourceDefaulter(ecModel) {
+export function resetSourceDefaulter(ecModel: GlobalModel): void {
     // `datasetMap` is used to make default encode.
-    inner(ecModel).datasetMap = createHashMap();
+    innerGlobalModel(ecModel).datasetMap = createHashMap();
 }
 
 /**
@@ -152,14 +188,12 @@ export function resetSourceDefaulter(ecModel) {
  * Simplify the typing of encode in option, avoiding the case like that:
  * series: [{encode: {x: 0, y: 1}}, {encode: {x: 0, y: 2}}, {encode: {x: 0, y: 
3}}],
  * where the "y" have to be manually typed as "1, 2, 3, ...".
- *
- * @param {module:echarts/model/Series} seriesModel
  */
-export function prepareSource(seriesModel) {
+export function prepareSource(seriesModel: SeriesEncodableModel): void {
     const seriesOption = seriesModel.option;
 
-    let data = seriesOption.data;
-    let sourceFormat = isTypedArray(data)
+    let data = seriesOption.data as OptionSourceData;
+    let sourceFormat: SourceFormat = isTypedArray(data)
         ? SOURCE_FORMAT_TYPED_ARRAY : SOURCE_FORMAT_ORIGINAL;
     let fromDataset = false;
 
@@ -172,7 +206,7 @@ export function prepareSource(seriesModel) {
         const datasetOption = datasetModel.option;
 
         data = datasetOption.source;
-        sourceFormat = inner(datasetModel).sourceFormat;
+        sourceFormat = innerDatasetModel(datasetModel).sourceFormat;
         fromDataset = true;
 
         // These settings from series has higher priority.
@@ -185,7 +219,7 @@ export function prepareSource(seriesModel) {
         data, sourceFormat, seriesLayoutBy, sourceHeader, dimensionsDefine
     );
 
-    inner(seriesModel).source = new Source({
+    innerSeriesModel(seriesModel).source = new Source({
         data: data,
         fromDataset: fromDataset,
         seriesLayoutBy: seriesLayoutBy,
@@ -199,15 +233,30 @@ export function prepareSource(seriesModel) {
 }
 
 // return {startIndex, dimensionsDefine, dimensionsCount}
-function completeBySourceData(data, sourceFormat, seriesLayoutBy, 
sourceHeader, dimensionsDefine) {
+function completeBySourceData(
+    data: OptionSourceData,
+    sourceFormat: SourceFormat,
+    seriesLayoutBy: SeriesLayoutBy,
+    sourceHeader: OptionSourceHeader,
+    dimensionsDefine: DimensionDefinitionLoose[]
+): {
+    dimensionsDefine: DimensionDefinition[];
+    startIndex: number;
+    dimensionsDetectCount: number;
+} {
+    let dimensionsDetectCount;
+    let startIndex: number;
+
     if (!data) {
-        return {dimensionsDefine: normalizeDimensionsDefine(dimensionsDefine)};
+        return {
+            dimensionsDefine: normalizeDimensionsDefine(dimensionsDefine),
+            startIndex,
+            dimensionsDetectCount
+        };
     }
 
-    let dimensionsDetectCount;
-    let startIndex;
-
     if (sourceFormat === SOURCE_FORMAT_ARRAY_ROWS) {
+        const dataArrayRows = data as OptionSourceDataArrayRows;
         // Rule: Most of the first line are string: it is header.
         // Caution: consider a line with 5 string and 1 number,
         // it still can not be sure it is a head, because the
@@ -224,7 +273,7 @@ function completeBySourceData(data, sourceFormat, 
seriesLayoutBy, sourceHeader,
                     }
                 }
             // 10 is an experience number, avoid long loop.
-            }, seriesLayoutBy, data, 10);
+            }, seriesLayoutBy, dataArrayRows, 10);
         }
         else {
             startIndex = sourceHeader ? 1 : 0;
@@ -233,33 +282,33 @@ function completeBySourceData(data, sourceFormat, 
seriesLayoutBy, sourceHeader,
         if (!dimensionsDefine && startIndex === 1) {
             dimensionsDefine = [];
             arrayRowsTravelFirst(function (val, index) {
-                dimensionsDefine[index] = val != null ? val : '';
-            }, seriesLayoutBy, data);
+                dimensionsDefine[index] = (val != null ? val + '' : '') as 
DimensionName;
+            }, seriesLayoutBy, dataArrayRows, Infinity);
         }
 
         dimensionsDetectCount = dimensionsDefine
             ? dimensionsDefine.length
             : seriesLayoutBy === SERIES_LAYOUT_BY_ROW
-            ? data.length
-            : data[0]
-            ? data[0].length
+            ? dataArrayRows.length
+            : dataArrayRows[0]
+            ? dataArrayRows[0].length
             : null;
     }
     else if (sourceFormat === SOURCE_FORMAT_OBJECT_ROWS) {
         if (!dimensionsDefine) {
-            dimensionsDefine = objectRowsCollectDimensions(data);
+            dimensionsDefine = objectRowsCollectDimensions(data as 
OptionSourceDataObjectRows);
         }
     }
     else if (sourceFormat === SOURCE_FORMAT_KEYED_COLUMNS) {
         if (!dimensionsDefine) {
             dimensionsDefine = [];
-            each(data, function (colArr, key) {
+            each(data as OptionSourceDataKeyedColumns, function (colArr, key) {
                 dimensionsDefine.push(key);
             });
         }
     }
     else if (sourceFormat === SOURCE_FORMAT_ORIGINAL) {
-        const value0 = getDataItemValue(data[0]);
+        const value0 = getDataItemValue((data as OptionSourceDataOriginal)[0]);
         dimensionsDetectCount = isArray(value0) && value0.length || 1;
     }
     else if (sourceFormat === SOURCE_FORMAT_TYPED_ARRAY) {
@@ -278,12 +327,12 @@ function completeBySourceData(data, sourceFormat, 
seriesLayoutBy, sourceHeader,
 // Consider dimensions defined like ['A', 'price', 'B', 'price', 'C', 'price'],
 // which is reasonable. But dimension name is duplicated.
 // Returns undefined or an array contains only object without null/undefiend 
or string.
-function normalizeDimensionsDefine(dimensionsDefine) {
+function normalizeDimensionsDefine(dimensionsDefine: 
DimensionDefinitionLoose[]): DimensionDefinition[] {
     if (!dimensionsDefine) {
         // The meaning of null/undefined is different from empty array.
         return;
     }
-    const nameMap = createHashMap();
+    const nameMap = createHashMap<{ count: number }, string>();
     return map(dimensionsDefine, function (item, index) {
         item = extend({}, isObject(item) ? item : {name: item});
 
@@ -317,8 +366,12 @@ function normalizeDimensionsDefine(dimensionsDefine) {
     });
 }
 
-function arrayRowsTravelFirst(cb, seriesLayoutBy, data, maxLoop) {
-    maxLoop == null && (maxLoop = Infinity);
+function arrayRowsTravelFirst(
+    cb: (val: OptionDataValue, idx: number) => void,
+    seriesLayoutBy: SeriesLayoutBy,
+    data: OptionSourceDataArrayRows,
+    maxLoop: number
+): void {
     if (seriesLayoutBy === SERIES_LAYOUT_BY_ROW) {
         for (let i = 0; i < data.length && i < maxLoop; i++) {
             cb(data[i] ? data[i][0] : null, i);
@@ -332,12 +385,12 @@ function arrayRowsTravelFirst(cb, seriesLayoutBy, data, 
maxLoop) {
     }
 }
 
-function objectRowsCollectDimensions(data) {
+function objectRowsCollectDimensions(data: OptionSourceDataObjectRows): 
DimensionDefinitionLoose[] {
     let firstIndex = 0;
     let obj;
     while (firstIndex < data.length && !(obj = data[firstIndex++])) {} // 
jshint ignore: line
     if (obj) {
-        const dimensions = [];
+        const dimensions: DimensionDefinitionLoose[] = [];
         each(obj, function (value, key) {
             dimensions.push(key);
         });
@@ -358,13 +411,14 @@ function objectRowsCollectDimensions(data) {
  *     The result of data arrengment of data dimensions like:
  *     | ser_shared_x | ser0_y | ser1_y | ser2_y |
  *
- * @param {Array.<Object|string>} coordDimensions [{name: <string>, type: 
<string>, dimsDef: <Array>}, ...]
- * @param {module:model/Series} seriesModel
- * @param {module:data/Source} source
- * @return {Object} encode Never be `null/undefined`.
+ * @return encode Never be `null/undefined`.
  */
-export function makeSeriesEncodeForAxisCoordSys(coordDimensions, seriesModel, 
source) {
-    const encode = {};
+export function makeSeriesEncodeForAxisCoordSys(
+    coordDimensions: (DimensionName | CoordDimensionDefinition)[],
+    seriesModel: SeriesModel,
+    source: Source
+): SeriesEncodeInternal {
+    const encode: SeriesEncodeInternal = {};
 
     const datasetModel = getDatasetModel(seriesModel);
     // Currently only make default when using dataset, util more reqirements 
occur.
@@ -372,21 +426,23 @@ export function 
makeSeriesEncodeForAxisCoordSys(coordDimensions, seriesModel, so
         return encode;
     }
 
-    const encodeItemName = [];
-    const encodeSeriesName = [];
+    const encodeItemName: DimensionIndex[] = [];
+    const encodeSeriesName: DimensionIndex[] = [];
 
     const ecModel = seriesModel.ecModel;
-    const datasetMap = inner(ecModel).datasetMap;
+    const datasetMap = innerGlobalModel(ecModel).datasetMap;
     const key = datasetModel.uid + '_' + source.seriesLayoutBy;
 
-    let baseCategoryDimIndex;
+    let baseCategoryDimIndex: number;
     let categoryWayValueDimStart;
     coordDimensions = coordDimensions.slice();
-    each(coordDimensions, function (coordDimInfo, coordDimIdx) {
-        !isObject(coordDimInfo) && (coordDimensions[coordDimIdx] = {name: 
coordDimInfo});
+    each(coordDimensions, function (coordDimInfoLoose, coordDimIdx) {
+        const coordDimInfo: CoordDimensionDefinition = 
isObject(coordDimInfoLoose)
+            ? coordDimInfoLoose
+            : (coordDimensions[coordDimIdx] = { name: coordDimInfoLoose as 
DimensionName });
         if (coordDimInfo.type === 'ordinal' && baseCategoryDimIndex == null) {
             baseCategoryDimIndex = coordDimIdx;
-            categoryWayValueDimStart = 
getDataDimCountOnCoordDim(coordDimensions[coordDimIdx]);
+            categoryWayValueDimStart = getDataDimCountOnCoordDim(coordDimInfo);
         }
         encode[coordDimInfo.name] = [];
     });
@@ -396,7 +452,7 @@ export function 
makeSeriesEncodeForAxisCoordSys(coordDimensions, seriesModel, so
 
     // TODO
     // Auto detect first time axis and do arrangement.
-    each(coordDimensions, function (coordDimInfo, coordDimIdx) {
+    each(coordDimensions, function (coordDimInfo: CoordDimensionDefinition, 
coordDimIdx) {
         const coordDimName = coordDimInfo.name;
         const count = getDataDimCountOnCoordDim(coordDimInfo);
 
@@ -428,13 +484,13 @@ export function 
makeSeriesEncodeForAxisCoordSys(coordDimensions, seriesModel, so
         }
     });
 
-    function pushDim(dimIdxArr, idxFrom, idxCount) {
+    function pushDim(dimIdxArr: DimensionIndex[], idxFrom: number, idxCount: 
number) {
         for (let i = 0; i < idxCount; i++) {
             dimIdxArr.push(idxFrom + i);
         }
     }
 
-    function getDataDimCountOnCoordDim(coordDimInfo) {
+    function getDataDimCountOnCoordDim(coordDimInfo: CoordDimensionDefinition) 
{
         const dimsDef = coordDimInfo.dimsDef;
         return dimsDef ? dimsDef.length : 1;
     }
@@ -448,12 +504,14 @@ export function 
makeSeriesEncodeForAxisCoordSys(coordDimensions, seriesModel, so
 /**
  * Work for data like [{name: ..., value: ...}, ...].
  *
- * @param {module:model/Series} seriesModel
- * @param {module:data/Source} source
- * @return {Object} encode Never be `null/undefined`.
+ * @return encode Never be `null/undefined`.
  */
-export function makeSeriesEncodeForNameBased(seriesModel, source, dimCount) {
-    const encode = {};
+export function makeSeriesEncodeForNameBased(
+    seriesModel: SeriesModel,
+    source: Source,
+    dimCount: number
+): SeriesEncodeInternal {
+    const encode: SeriesEncodeInternal = {};
 
     const datasetModel = getDatasetModel(seriesModel);
     // Currently only make default when using dataset, util more reqirements 
occur.
@@ -473,11 +531,12 @@ export function makeSeriesEncodeForNameBased(seriesModel, 
source, dimCount) {
         });
     }
 
-    // idxResult: {v, n}.
+    type IdxResult = { v: number, n: number };
+
     const idxResult = (function () {
 
-        const idxRes0 = {};
-        const idxRes1 = {};
+        const idxRes0 = {} as IdxResult;
+        const idxRes1 = {} as IdxResult;
         const guessRecords = [];
 
         // 5 is an experience value.
@@ -521,7 +580,7 @@ export function makeSeriesEncodeForNameBased(seriesModel, 
source, dimCount) {
             }
         }
 
-        function fulfilled(idxResult) {
+        function fulfilled(idxResult: IdxResult) {
             return idxResult.v != null && idxResult.n != null;
         }
 
@@ -529,7 +588,7 @@ export function makeSeriesEncodeForNameBased(seriesModel, 
source, dimCount) {
     })();
 
     if (idxResult) {
-        encode.value = idxResult.v;
+        encode.value = [idxResult.v];
         // `potentialNameDimIndex` has highest priority.
         const nameDimIndex = potentialNameDimIndex != null ? 
potentialNameDimIndex : idxResult.n;
         // By default, label use itemName in charts.
@@ -544,7 +603,7 @@ export function makeSeriesEncodeForNameBased(seriesModel, 
source, dimCount) {
 /**
  * If return null/undefined, indicate that should not use datasetModel.
  */
-function getDatasetModel(seriesModel) {
+function getDatasetModel(seriesModel: SeriesEncodableModel): DatasetModel {
     const option = seriesModel.option;
     // Caution: consider the scenario:
     // A dataset is declared and a series is not expected to use the dataset,
@@ -553,7 +612,7 @@ function getDatasetModel(seriesModel) {
     // the user should set an empty array to avoid that dataset is used by 
default.
     const thisData = option.data;
     if (!thisData) {
-        return seriesModel.ecModel.getComponent('dataset', option.datasetIndex 
|| 0);
+        return seriesModel.ecModel.getComponent('dataset', option.datasetIndex 
|| 0) as DatasetModel;
     }
 }
 
@@ -561,12 +620,8 @@ function getDatasetModel(seriesModel) {
  * The rule should not be complex, otherwise user might not
  * be able to known where the data is wrong.
  * The code is ugly, but how to make it neat?
- *
- * @param {module:echars/data/Source} source
- * @param {number} dimIndex
- * @return {BE_ORDINAL} guess result.
  */
-export function guessOrdinal(source, dimIndex) {
+export function guessOrdinal(source: Source, dimIndex: DimensionIndex): 
BeOrdinalValue {
     return doGuessOrdinal(
         source.data,
         source.sourceFormat,
@@ -580,8 +635,13 @@ export function guessOrdinal(source, dimIndex) {
 // dimIndex may be overflow source data.
 // return {BE_ORDINAL}
 function doGuessOrdinal(
-    data, sourceFormat, seriesLayoutBy, dimensionsDefine, startIndex, dimIndex
-) {
+    data: Source['data'],
+    sourceFormat: Source['sourceFormat'],
+    seriesLayoutBy: Source['seriesLayoutBy'],
+    dimensionsDefine: Source['dimensionsDefine'],
+    startIndex: Source['startIndex'],
+    dimIndex: DimensionIndex
+): BeOrdinalValue {
     let result;
     // Experience value.
     const maxLoop = 5;
@@ -610,8 +670,9 @@ function doGuessOrdinal(
     }
 
     if (sourceFormat === SOURCE_FORMAT_ARRAY_ROWS) {
+        const dataArrayRows = data as OptionSourceDataArrayRows;
         if (seriesLayoutBy === SERIES_LAYOUT_BY_ROW) {
-            const sample = data[dimIndex];
+            const sample = dataArrayRows[dimIndex];
             for (let i = 0; i < (sample || []).length && i < maxLoop; i++) {
                 if ((result = detectValue(sample[startIndex + i])) != null) {
                     return result;
@@ -619,8 +680,8 @@ function doGuessOrdinal(
             }
         }
         else {
-            for (let i = 0; i < data.length && i < maxLoop; i++) {
-                const row = data[startIndex + i];
+            for (let i = 0; i < dataArrayRows.length && i < maxLoop; i++) {
+                const row = dataArrayRows[startIndex + i];
                 if (row && (result = detectValue(row[dimIndex])) != null) {
                     return result;
                 }
@@ -628,21 +689,23 @@ function doGuessOrdinal(
         }
     }
     else if (sourceFormat === SOURCE_FORMAT_OBJECT_ROWS) {
+        const dataObjectRows = data as OptionSourceDataObjectRows;
         if (!dimName) {
             return BE_ORDINAL.Not;
         }
-        for (let i = 0; i < data.length && i < maxLoop; i++) {
-            const item = data[i];
+        for (let i = 0; i < dataObjectRows.length && i < maxLoop; i++) {
+            const item = dataObjectRows[i];
             if (item && (result = detectValue(item[dimName])) != null) {
                 return result;
             }
         }
     }
     else if (sourceFormat === SOURCE_FORMAT_KEYED_COLUMNS) {
+        const dataKeyedColumns = data as OptionSourceDataKeyedColumns;
         if (!dimName) {
             return BE_ORDINAL.Not;
         }
-        const sample = data[dimName];
+        const sample = dataKeyedColumns[dimName];
         if (!sample || isTypedArray(sample)) {
             return BE_ORDINAL.Not;
         }
@@ -653,8 +716,9 @@ function doGuessOrdinal(
         }
     }
     else if (sourceFormat === SOURCE_FORMAT_ORIGINAL) {
-        for (let i = 0; i < data.length && i < maxLoop; i++) {
-            const item = data[i];
+        const dataOriginal = data as OptionSourceDataOriginal;
+        for (let i = 0; i < dataOriginal.length && i < maxLoop; i++) {
+            const item = dataOriginal[i];
             const val = getDataItemValue(item);
             if (!isArray(val)) {
                 return BE_ORDINAL.Not;
@@ -665,11 +729,11 @@ function doGuessOrdinal(
         }
     }
 
-    function detectValue(val) {
+    function detectValue(val: OptionDataValue): BeOrdinalValue {
         const beStr = isString(val);
         // Consider usage convenience, '1', '2' will be treated as "number".
         // `isFinit('')` get `true`.
-        if (val != null && isFinite(val) && val !== '') {
+        if (val != null && isFinite(val as number) && val !== '') {
             return beStr ? BE_ORDINAL.Might : BE_ORDINAL.Not;
         }
         else if (beStr && val !== '-') {
diff --git a/src/label/LabelManager.ts b/src/label/LabelManager.ts
index 12ddbc7..646ded9 100644
--- a/src/label/LabelManager.ts
+++ b/src/label/LabelManager.ts
@@ -36,7 +36,8 @@ import {
     LabelLayoutOptionCallbackParams,
     LabelLineOption,
     Dictionary,
-    ECElement
+    ECElement,
+    SeriesDataType
 } from '../util/types';
 import { parsePercent } from '../util/number';
 import ChartView from '../view/Chart';
@@ -57,7 +58,7 @@ interface LabelDesc {
 
     seriesModel: SeriesModel
     dataIndex: number
-    dataType: string
+    dataType: SeriesDataType
 
     layoutOption: LabelLayoutOptionCallback | LabelLayoutOption
     computedLayoutOption: LabelLayoutOption
@@ -188,7 +189,7 @@ class LabelManager {
      */
     private _addLabel(
         dataIndex: number,
-        dataType: string,
+        dataType: SeriesDataType,
         seriesModel: SeriesModel,
         label: ZRText,
         layoutOption: LabelDesc['layoutOption']
diff --git a/src/model/Series.ts b/src/model/Series.ts
index a580c9c..64c24e0 100644
--- a/src/model/Series.ts
+++ b/src/model/Series.ts
@@ -30,7 +30,7 @@ import * as modelUtil from '../util/model';
 import {
     DataHost, DimensionName, StageHandlerProgressParams,
     SeriesOption, TooltipRenderMode, ZRColor, BoxLayoutOptionMixin,
-    ScaleDataValue, Dictionary, ColorString, OptionDataItemObject
+    ScaleDataValue, Dictionary, ColorString, OptionDataItemObject, 
SeriesDataType
 } from '../util/types';
 import ComponentModel, { ComponentModelConstructor } from './Component';
 import {ColorPaletteMixin} from './mixin/colorPalette';
@@ -327,11 +327,11 @@ class SeriesModel<Opt extends SeriesOption = 
SeriesOption> extends ComponentMode
      * data in the stream procedure. So we fetch data from upstream
      * each time `task.perform` called.
      */
-    getData(dataType?: string): List<this> {
+    getData(dataType?: SeriesDataType): List<this> {
         const task = getCurrentTask(this);
         if (task) {
             const data = task.context.data;
-            return dataType == null ? data : data.getLinkedData(dataType);
+            return (dataType == null ? data : data.getLinkedData(dataType)) as 
List<this>;
         }
         else {
             // When series is not alive (that may happen when click toolbox
@@ -344,12 +344,10 @@ class SeriesModel<Opt extends SeriesOption = 
SeriesOption> extends ComponentMode
 
     getAllData(): ({
         data: List,
-        type?: string
+        type?: SeriesDataType
     })[] {
         const mainData = this.getData();
-        // @ts-ignore
         return (mainData && mainData.getLinkedDataAll)
-            // @ts-ignore
             ? mainData.getLinkedDataAll()
             : [{ data: mainData }];
     }
@@ -419,7 +417,7 @@ class SeriesModel<Opt extends SeriesOption = SeriesOption> 
extends ComponentMode
     formatTooltip(
         dataIndex: number,
         multipleSeries?: boolean,
-        dataType?: string,
+        dataType?: SeriesDataType,
         renderMode?: TooltipRenderMode
     ): {
         html: string,
@@ -613,11 +611,11 @@ class SeriesModel<Opt extends SeriesOption = 
SeriesOption> extends ComponentMode
     }
 
     // PENGING If selectedMode is null ?
-    select(innerDataIndices: number[], dataType?: string): void {
+    select(innerDataIndices: number[], dataType?: SeriesDataType): void {
         this._innerSelect(this.getData(dataType), innerDataIndices);
     }
 
-    unselect(innerDataIndices: number[], dataType?: string): void {
+    unselect(innerDataIndices: number[], dataType?: SeriesDataType): void {
         const selectedMap = this.option.selectedMap;
         if (!selectedMap) {
             return;
@@ -631,7 +629,7 @@ class SeriesModel<Opt extends SeriesOption = SeriesOption> 
extends ComponentMode
         }
     }
 
-    toggleSelect(innerDataIndices: number[], dataType?: string): void {
+    toggleSelect(innerDataIndices: number[], dataType?: SeriesDataType): void {
         const tmpArr: number[] = [];
         for (let i = 0; i < innerDataIndices.length; i++) {
             tmpArr[0] = innerDataIndices[i];
@@ -654,7 +652,7 @@ class SeriesModel<Opt extends SeriesOption = SeriesOption> 
extends ComponentMode
         return dataIndices;
     }
 
-    isSelected(dataIndex: number, dataType?: string): boolean {
+    isSelected(dataIndex: number, dataType?: SeriesDataType): boolean {
         const selectedMap = this.option.selectedMap;
         if (!selectedMap) {
             return false;
diff --git a/src/model/mixin/dataFormat.ts b/src/model/mixin/dataFormat.ts
index eacee23..a10f4a7 100644
--- a/src/model/mixin/dataFormat.ts
+++ b/src/model/mixin/dataFormat.ts
@@ -27,7 +27,8 @@ import {
     CallbackDataParams,
     ColorString,
     ZRColor,
-    OptionDataValue
+    OptionDataValue,
+    SeriesDataType
 } from '../../util/types';
 import GlobalModel from '../Global';
 
@@ -51,7 +52,7 @@ class DataFormatMixin {
      */
     getDataParams(
         dataIndex: number,
-        dataType?: string
+        dataType?: SeriesDataType
     ): CallbackDataParams {
 
         const data = this.getData(dataType);
@@ -102,7 +103,7 @@ class DataFormatMixin {
     getFormattedLabel(
         dataIndex: number,
         status?: DisplayState,
-        dataType?: string,
+        dataType?: SeriesDataType,
         labelDimIndex?: number,
         formatter?: string | ((params: object) => string),
         extendParams?: Partial<CallbackDataParams>
@@ -154,7 +155,7 @@ class DataFormatMixin {
      */
     getRawValue(
         idx: number,
-        dataType?: string
+        dataType?: SeriesDataType
     ): unknown {
         return retrieveRawValue(this.getData(dataType), idx);
     }
diff --git a/src/stream/task.ts b/src/stream/task.ts
index a25b14e..5f4a65f 100644
--- a/src/stream/task.ts
+++ b/src/stream/task.ts
@@ -22,10 +22,11 @@ import { __DEV__ } from '../config';
 import SeriesModel from '../model/Series';
 import { Pipeline } from './Scheduler';
 import { Payload } from '../util/types';
+import List from '../data/List';
 
 export interface TaskContext {
-    outputData?: any;
-    data?: any;
+    outputData?: List;
+    data?: List;
     payload?: Payload;
     model?: SeriesModel;
 };
diff --git a/src/util/graphic.ts b/src/util/graphic.ts
index 124e8bf..3ea91f7 100644
--- a/src/util/graphic.ts
+++ b/src/util/graphic.ts
@@ -58,7 +58,8 @@ import {
     ParsedValue,
     BlurScope,
     InnerFocus,
-    PayloadAnimationPart
+    PayloadAnimationPart,
+    SeriesDataType
 } from './types';
 import { makeInner } from './model';
 import {
@@ -897,7 +898,7 @@ export interface ECData {
     dataModel?: DataModel;
     eventData?: ECEventData;
     seriesIndex?: number;
-    dataType?: string;
+    dataType?: SeriesDataType;
 
     focus?: InnerFocus
     blurScope?: BlurScope
diff --git a/src/util/model.ts b/src/util/model.ts
index 5cf3568..ed30d25 100644
--- a/src/util/model.ts
+++ b/src/util/model.ts
@@ -29,7 +29,7 @@ import {
     indexOf
 } from 'zrender/src/core/util';
 import env from 'zrender/src/core/env';
-import GlobalModel, { QueryConditionKindB } from '../model/Global';
+import GlobalModel from '../model/Global';
 import ComponentModel, {ComponentModelConstructor} from '../model/Component';
 import List from '../data/List';
 import {
diff --git a/src/util/states.ts b/src/util/states.ts
index 2f3c474..15f53f8 100644
--- a/src/util/states.ts
+++ b/src/util/states.ts
@@ -5,7 +5,7 @@ import { PatternObject } from 'zrender/src/graphic/Pattern';
 import { GradientObject } from 'zrender/src/graphic/Gradient';
 import Element, { ElementEvent } from 'zrender/src/Element';
 import Model from '../model/Model';
-import { DisplayState, ECElement, ColorString, BlurScope, InnerFocus, Payload, 
ZRColor } from './types';
+import { DisplayState, ECElement, ColorString, BlurScope, InnerFocus, Payload, 
ZRColor, SeriesDataType } from './types';
 import { extend, indexOf, isArrayLike, isObject, keys, isArray, each } from 
'zrender/src/core/util';
 import { getECData } from './graphic';
 import * as colorTool from 'zrender/src/tool/color';
@@ -188,7 +188,7 @@ function getFromStateStyle(
 function createEmphasisDefaultState(
     el: Displayable,
     stateName: 'emphasis',
-    targetStates?: string[],
+    targetStates: string[],
     state: Displayable['states'][number]
 ) {
     const hasSelect = targetStates && indexOf(targetStates, 'select') >= 0;
@@ -436,7 +436,7 @@ export function toggleSeriesBlurState(
             else if (isObject(focus)) {
                 const dataTypes = keys(focus);
                 for (let d = 0; d < dataTypes.length; d++) {
-                    leaveBlurOfIndices(seriesModel.getData(dataTypes[d]), 
focus[dataTypes[d]]);
+                    leaveBlurOfIndices(seriesModel.getData(dataTypes[d] as 
SeriesDataType), focus[dataTypes[d]]);
                 }
             }
 
@@ -530,7 +530,7 @@ export function updateSeriesElementSelection(seriesModel: 
SeriesModel) {
 export function getAllSelectedIndices(ecModel: GlobalModel) {
     const ret: {
         seriesIndex: number
-        dataType?: string
+        dataType?: SeriesDataType
         dataIndex: number[]
     }[] = [];
     ecModel.eachSeries(function (seriesModel) {
diff --git a/src/util/types.ts b/src/util/types.ts
index 0c7cf84..5ad303f 100644
--- a/src/util/types.ts
+++ b/src/util/types.ts
@@ -126,7 +126,7 @@ export interface ECElement extends Element {
 }
 
 export interface DataHost {
-    getData(dataType?: string): List;
+    getData(dataType?: SeriesDataType): List;
 }
 
 export interface DataModel extends DataHost, DataFormatMixin {}
@@ -161,7 +161,7 @@ export interface SelectChangedPayload extends Payload {
     fromActionPayload: Payload
     selected: {
         seriesIndex: number
-        dataType?: string
+        dataType?: SeriesDataType
         dataIndex: number[]
     }[]
 }
@@ -302,7 +302,7 @@ export type DimensionName = string;
 export type DimensionLoose = DimensionName | DimensionIndexLoose;
 export type DimensionType = ListDimensionType;
 
-export const VISUAL_DIMENSIONS = createHashMap([
+export const VISUAL_DIMENSIONS = createHashMap<number, keyof 
DataVisualDimensions>([
     'tooltip', 'label', 'itemName', 'itemId', 'seriesName'
 ]);
 // The key is VISUAL_DIMENSIONS
@@ -318,11 +318,11 @@ export interface DataVisualDimensions {
 }
 
 export type DimensionDefinition = {
-    type?: string,
-    name: string,
+    type?: ListDimensionType,
+    name: DimensionName,
     displayName?: string
 };
-export type DimensionDefinitionLoose = DimensionDefinition['type'] | 
DimensionDefinition;
+export type DimensionDefinitionLoose = DimensionDefinition['name'] | 
DimensionDefinition;
 
 export const SOURCE_FORMAT_ORIGINAL = 'original' as const;
 export const SOURCE_FORMAT_ARRAY_ROWS = 'arrayRows' as const;
@@ -343,7 +343,10 @@ export const SERIES_LAYOUT_BY_COLUMN = 'column' as const;
 export const SERIES_LAYOUT_BY_ROW = 'row' as const;
 
 export type SeriesLayoutBy = typeof SERIES_LAYOUT_BY_COLUMN | typeof 
SERIES_LAYOUT_BY_ROW;
+// null/undefined/'auto': auto detect header, see 
"src/data/helper/sourceHelper".
+export type OptionSourceHeader = boolean | 'auto';
 
+export type SeriesDataType = 'main' | 'node' | 'edge';
 
 
 // --------------------------------------------
@@ -445,22 +448,56 @@ export type ECOption = ECUnitOption | {
 };
 
 // series.data or dataset.source
-export type OptionSourceData =
-    ArrayLike<OptionDataItem>
-    | Dictionary<ArrayLike<OptionDataItem>>; // Only for 
`SOURCE_FORMAT_KEYED_COLUMNS`.
+export type OptionSourceData<
+    VAL extends OptionDataValue = OptionDataValue,
+    ORIITEM extends OptionDataItemOriginal<VAL> = OptionDataItemOriginal<VAL>
+> =
+    OptionSourceDataOriginal<VAL, ORIITEM>
+    | OptionSourceDataObjectRows<VAL>
+    | OptionSourceDataArrayRows<VAL>
+    | OptionSourceDataKeyedColumns<VAL>
+    | OptionSourceDataTypedArray;
+export type OptionDataItemOriginal<
+    VAL extends OptionDataValue = OptionDataValue
+> = VAL | VAL[] | OptionDataItemObject<VAL>;
+export type OptionSourceDataOriginal<
+    VAL extends OptionDataValue = OptionDataValue,
+    ORIITEM extends OptionDataItemOriginal<VAL> = OptionDataItemOriginal<VAL>
+> = ArrayLike<ORIITEM>;
+export type OptionSourceDataObjectRows<VAL extends OptionDataValue = 
OptionDataValue> =
+    ArrayLike<Dictionary<VAL>>;
+export type OptionSourceDataArrayRows<VAL extends OptionDataValue = 
OptionDataValue> =
+    ArrayLike<ArrayLike<VAL>>;
+export type OptionSourceDataKeyedColumns<VAL extends OptionDataValue = 
OptionDataValue> =
+    Dictionary<ArrayLike<VAL>>;
+export type OptionSourceDataTypedArray = ArrayLike<number>;
+
 // See also `model.js#getDataItemValue`.
 export type OptionDataItem =
     OptionDataValue
     | Dictionary<OptionDataValue>
-    | ArrayLike<OptionDataValue>
+    | OptionDataValue[]
     // FIXME: In some case (markpoint in geo (geo-map.html)), dataItem is 
{coord: [...]}
     | OptionDataItemObject<OptionDataValue>;
 // Only for `SOURCE_FORMAT_KEYED_ORIGINAL`
 export type OptionDataItemObject<T> = {
-    name?: string
-    value?: T[] | T
+    id?: string | number;
+    name?: string;
+    value?: T[] | T;
     selected?: boolean;
 };
+export interface GraphEdgeItemObject<
+    VAL extends OptionDataValue
+> extends OptionDataItemObject<VAL> {
+    /**
+     * Name or index of source node.
+     */
+    source?: string | number
+    /**
+     * Name or index of target node.
+     */
+    target?: string | number
+}
 export type OptionDataValue = string | number | Date;
 
 export type OptionDataValueNumeric = number | '-';
@@ -490,7 +527,7 @@ export interface OptionEncodeVisualDimensions {
 export interface OptionEncode extends OptionEncodeVisualDimensions {
     [coordDim: string]: OptionEncodeValue
 }
-export type OptionEncodeValue = DimensionIndex[] | DimensionIndex | 
DimensionName[] | DimensionName;
+export type OptionEncodeValue = DimensionLoose | DimensionLoose[];
 export type EncodeDefaulter = (source: Source, dimCount: number) => 
OptionEncode;
 
 // TODO: TYPE Different callback param for different series
@@ -509,7 +546,7 @@ export interface CallbackDataParams {
     name: string;
     dataIndex: number;
     data: any;
-    dataType?: string;
+    dataType?: SeriesDataType;
     value: any;
     color?: ZRColor;
     borderColor?: string;
@@ -869,7 +906,7 @@ export interface LabelLineOption {
 
 export interface LabelLayoutOptionCallbackParams {
     dataIndex: number,
-    dataType: string,
+    dataType: SeriesDataType,
     seriesIndex: number,
     text: string
     align: ZRTextAlign
@@ -1234,7 +1271,7 @@ export interface SeriesOption<StateOption=any, 
ExtraStateOpts extends {
     cursor?: string
 
     // Needs to be override
-    data?: any
+    data?: unknown
 
     legendHoverLink?: boolean
 
@@ -1327,6 +1364,7 @@ export interface SeriesSamplingOptionMixin {
 export interface SeriesEncodeOptionMixin {
     datasetIndex?: number;
     seriesLayoutBy?: SeriesLayoutBy;
-    dimensions?: DimensionName[];
+    sourceHeader?: OptionSourceHeader;
+    dimensions?: DimensionDefinitionLoose[];
     encode?: OptionEncode
 }


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

Reply via email to