Vue+Typescript项目中使用echarts

2023-02-12 130844 日常教程

方案一:推荐

在typescript+Vue的项目中引用echarts,为了加强引用,引入echarts和@types/echarts两个包,一个是工程依赖,一个是声明依赖。

npm install echarts --save
npm install --save @types/echarts

然后在需要引用echarts的组件中引入echarts

<script lang="ts">
……
import echarts from 'echarts';
……
</script>

然后设置好option选项,将图表渲染在DOM里:

// HTML部分
<div ref="chart"></div> // Script部分
option={};
const Chart = echarts.init(this.$refs.chart as HTMLCanvasElement);
Chart.setOption(this.option);

按理来说是这样的,然后我run的时候图表显示也是正确的,但是控制台爆出了类型不兼容的错误,如下:

Argument of type '{ color: string[]; legend: { data: { name: string; textStyle: { color: string; fontSize: number; }; }[]; right: number; top: number; itemWidth: number; itemHeight: number; padding: number; itemGap: number; }; xAxis: { ...; }; yAxis: { ...; }; grid: { ...; }; series: { ...; }[]; }' is not assignable to parameter of type 'EChartOption<SeriesBar | SeriesBoxplot | SeriesCandlestick | SeriesCustom | SeriesEffectScatter | SeriesFunnel | SeriesGauge | SeriesGraph | SeriesHeatmap | SeriesLine | SeriesLines | ... 10 more ... | SeriesTreemap>'.
Types of property 'xAxis' are incompatible.
Type '{ type: string; data: string[]; boundaryGap: boolean; axisLabel: { textStyle: { color: string; }; }; axisLine: { lineStyle: { type: string; color: string[]; width: string; }; }; }' is not assignable to type 'XAxis | XAxis[] | undefined'.
Type '{ type: string; data: string[]; boundaryGap: boolean; axisLabel: { textStyle: { color: string; }; }; axisLine: { lineStyle: { type: string; color: string[]; width: string; }; }; }' is not assignable to type 'XAxis'.
Types of property 'type' are incompatible.
Type 'string' is not assignable to type '"value" | "category" | "time" | "log" | undefined'.
124 | draw() {
125 | const Chart = echarts.init(this.$refs.chart as HTMLCanvasElement);
> 126 | watchChart.setOption(this.option);

最后发现所有在@type/echarts(node_modules/@types/echarts/index.d.ts)里面声明的一些联合变量类型,类似于下图所示的这种,都会出现这种问题:

type Type = 'value' | 'category' | 'time' | 'log'; 是给"'value' | 'category' | 'time' | 'log'"给了一个别名Type  ,详见:  https://ts.xcatliu.com/advanced/type-aliases.html

也可以说是一个字符串字面量类型,详见: https://ts.xcatliu.com/advanced/string-literal-types.html

我在引用处代码里面option配置是:

因为声明的时候type是个联合类型,而不是type?:string这种类型,所以导致直接配置参数出现错误:

最后查看了网上的解决办法:https://zhuanlan.zhihu.com/p/28902584

可以直接 const ec = echarts as any; 但是这种做法很不可取。

最后在 https://jkchao.github.io/typescript-book-chinese/typings/literals.html#%E6%8E%A8%E6%96%AD 找到了解决办法,可以采用一个简单的类型断言来告诉 TypeScript 想推断的字面量:

在本实例中就是:

option = {
xAxis: {
type: ('category' as 'category'),
axisLine: {
lineStyle: {
type: ('dashed' as 'dashed'),
},
},
},
}

到此,完美解决了我的问题(其实是个大神帮我找到的解决方法,在此感谢所有的前辈们)。

方案二:成功但是不够严谨

最后删除了 @types/echarts ,在 echarts.d.ts 中自定义了 echarts 的声明 ,

declare module 'echarts' {
const echarts: any;
export default echarts;
}

然后引用成功并且没有爆出类型错误,但是失去了ts强引用的优势。

方案三:简单直接

直接越过ts的类型检查………………………………………………

Vue+Typescript项目中使用echarts的相关教程结束。

为什么在大型Python项目中推荐使用Monorepo环境管理?

Monorepo是应对跨子包频繁修改、版本对齐成本高、CI耗时爆炸等痛点的止损方案;需统一依赖管理、确保本地与CI环境一致,并严守子包独立测试边界。 Monorepo不是“更先进”,而是对特定规模和协作模式的项目更可控——当Python项目中出现跨子包频繁修改、版本对齐成本高、CI耗时爆炸或本地开发反复pipinstall-e失败时,Monorepo就不是可选项,而是止损点。 跨包依赖变更必须原子...

为什么在Python项目中推荐使用Poetry管理包依赖?

poetryinstall与pipinstall-rrequirements.txt的本质差异在于:前者是“解析后装”,基于poetry.lock中已验证的完整依赖图确保版本兼容并自动激活专属虚拟环境;后者是“盲装”,仅按文本顺序安装、不解析依赖冲突、不隔离环境,易导致静默覆盖和全局污染。 因为pipinstall-rrequirements.txt无法保证依赖一致性,而poetryinstall...

Python Django项目怎么解决跨域请求问题_通过django-cors-headers中间件配置

装了django-cors-headers仍报“No'Access-Control-Allow-Origin'header”是因为CorsMiddleware位置错误(须在SessionMiddleware之后、CommonMiddleware之前)、CORS_ALLOW_ALL_ORIGINS=True未正确配置(旧版CORS_ORIGIN_ALLOW_ALL已弃用),或未设CORS_ALLOW...

如何提升Python项目的静态检查性能_使用Ruff替代Flake8和Isort

Ruff比flake8+isort快10–100倍,因其用Rust实现单二进制、零解释器开销、AST复用与并行遍历,而非单纯依赖语言性能;迁移需分阶段配置对齐,避免规则差异导致误报或语义错误。 ruff确实能显著提升Python项目的静态检查性能——它用Rust编写,单进程、零依赖、启动快、检查快,多数项目下比flake8+isort组合快10–100倍。但直接替换不是“装上就赢”,关键在配置迁移...

如何在Python中利用Namespace Packages管理大型项目_跨目录聚合子模块

NamespacePackages不可用普通包替代,因其核心价值是允许多个物理目录(如Git子模块、SDK、本地目录)无依赖地共同贡献同一逻辑包名(如myorg.utils),而普通包因__init__.py存在会锁死路径语义,无法自动聚合。 NamespacePackages为什么不能用普通包替代 普通Python包要求存在init.py文件,一旦出现,就锁死了该路径作为“常规包”的语义。而Na...

如何在 Poetry 项目外直接导入其模块(无需安装或打包)

本文介绍一种轻量、临时的解决方案,让位于Poetry项目外部的Python脚本(如scripts/script.py)能直接导入Poetry项目内(如modules-project/modules/)的模块及其依赖,无需重新初始化Poetry项目、发布包或修改系统路径。 本文介绍一种轻量、临时的解决方案,让位于poetry项目外部的python脚本(如`scripts/script.py`)能直接...

Python项目中多进程消费同一个RabbitMQ队列怎么保障数据一致性?

RabbitMQ本身保证单条消息只投递一次给一个消费者,数据一致性问题源于业务逻辑并发执行导致的竞态,而非消息重复投递;basic_ack仅确认消息接收,不保障业务执行唯一性,故无法解决数据一致性问题。 多进程消费同一个RabbitMQ队列时,数据一致性问题不来自RabbitMQ本身(它天然保证单条消息只投递一次给一个消费者),而来自业务逻辑并发执行导致的竞态——比如多个进程同时读写同一张数据库表...

为什么Python项目要区分开发环境与生产环境依赖_使用dev-requirements

不能直接用于生产环境,因requirements.txt常混入pytest等开发工具且含未声明的间接依赖,易致镜像膨胀、攻击面扩大及静默兼容问题。 pipinstall-rrequirements.txt为什么不能直接用在生产环境 因为requirements.txt很可能混入了开发专用工具,比如pytest、black、mypy,这些包既不参与运行时逻辑,又会增大镜像体积、引入额外攻击面。更危险...