我在使用 chartjs 线段时遇到了一些问题:
segment: {
borderDash: context => unreachableDash(context, [5, 5]) || [5, 0],
borderColor: context => unreachableColor(context, "#B5B5C3") || "#3DC0FF",
backgroundColor: (context) => {
let {ctx, chartArea} = context.chart;
return unreachableBgColor(context, this.getGradientUnreachable(ctx, chartArea)) || this.getGradient(ctx, chartArea)
}
}
我正在使用 TS,如果我将 backgroundColor 的上下文参数类型设置为任何或者如果我这样做,一切都工作正常
// @ts-ignore.
如果我不这样做,上下文类型是
ScriptableLineSegmentContext
,这是正确的,但在尝试访问 context.chart
时出现此错误:
TS2339: Property 'chart' does not exist on type 'ScriptableLineSegmentContext'.
有人遇到过这个问题吗?
我只尝试使用 any 类型和 @ts-ignore 并且它有效但如果有解决方法它会很酷
你是对的,如果这不符合 bug 的条件,那肯定是 chart.js 错失了 document 的机会 并包含在类型定义中,尤其是对于 难以处理的环境 全局变量。
/src/helpers/helpers.options.ts
函数createContext
具有以下定义。
export function createContext(parentContext: object, context: object) {
return Object.assign(Object.create(parentContext), context);
}
/src/helpers/helpers.segment.js
const chartContext = line._chart.getContext();
//.....
segmentOptions.setContext(createContext(chartContext, {
type: 'segment',
p0: prev,
p1: pt,
p0DataIndex: (i - 1) % count,
p1DataIndex: i % count,
datasetIndex
})));
/src/core/core.controller.js
中定义
getContext() {
return this.$context || (this.$context = createContext(null, {chart: this, type: 'chart'}));
}
包括一个
chart
条目,其中包含对图表的引用
本身。
此行为与其他可编写脚本的上下文一致 在整个代码中,图表本身的上下文 是
createContext
被调用时的唯一实例
带有null
第一个参数。
话虽如此,一个可能的替代方案是创建 图表分两个阶段,模式如下:
const config = {
// ....
};
const chart = new Chart('line-chart', config);
// now you have the chart reference
chart.data.datasets[0].segment = {
borderColor: () => ... // use chart global variable
};
chart.update();
这很尴尬,我想它会是 角度更是如此。
as unknown as
而不是@ts-ignore
总之,您可以信赖您的解决方案 使用当前版本的 chart.js,它是 它不太可能在这个主要版本 (4) 中改变。
如果你想避免使用
// @ts-ignore
你可以
使用 type assertions 使其工作
类似的东西:
backgroundColor: (context) => {
let {ctx, chartArea} = (context as unknown as {chart: Chart}).chart;
//....
}