amCharts v5 模板适配器示例在作为 TypeScript 而不是 JavaScript 运行时抛出错误

2024-01-12

我正在尝试根据值更改条形颜色,即在 JS 中很简单 https://codepen.io/team/amcharts/pen/KKmbKBg?editors=1111,但是当我在 TSX 文件中实现代码时,它给了我一个错误:

正如你所看到的,VS Code 告诉我dataItem不是以下的财产target当文件具有 TSX 扩展名时。如果我将扩展名更改为 JSX,代码将按预期执行和工作,但我想使用 TypeScript

I'm using the code almost verbatim from the example https://www.amcharts.com/docs/v5/charts/xy-chart/series/column-series/#Value_dependent_coloring enter image description here enter image description here

在上面的示例链接中,TS 和 JS 代码是相同的。 我不明白为什么dataItem的财产target在 JS 中可以识别,但在 TS 中不能识别。

这是我的文件中的完整代码:

import React, { useEffect } from 'react';

import * as am5 from "@amcharts/amcharts5";
import * as am5xy from "@amcharts/amcharts5/xy";
import am5themes_Animated from "@amcharts/amcharts5/themes/Animated";

import { AxisRenderer } from '@amcharts/amcharts5/.internal/charts/xy/axes/AxisRenderer';

interface IChartData {
     name: string; 
     metricName: string;
     value: number 
}

interface IChartProps {
    title: string;
    chartData: Array<IChartData>;
    chartContainer: string;
    showLegend: boolean;
    //orientation: am4core.PointerOrientation;
    colorPositiveValues: string;
    colorNegativeValues: string;
    hideValueAxisLabels?: boolean;
    hideCategoryAxisLabels?: boolean;
    hideGridLines?: boolean;
    useCursor?: boolean;
    valueAxisTitle: string;
    showSavedWasted?: boolean;
}



export const StackedBarChart = (props: IChartProps ) => {

    useEffect(() => {

        /* Chart code */
        // Create root element
        // https://www.amcharts.com/docs/v5/getting-started/#Root_element
        let root = am5.Root.new(props.chartContainer);

        // Set themes
        // https://www.amcharts.com/docs/v5/concepts/themes/
        root.setThemes([
        am5themes_Animated.new(root)
        ]);

        // Create chart
        // https://www.amcharts.com/docs/v5/charts/xy-chart/
        let chart = root.container.children.push(
        am5xy.XYChart.new(root, {
            panX: false,
            panY: false,
            wheelX: "panX",
            wheelY: "zoomX",
            layout: root.verticalLayout,
            arrangeTooltips: false
        })
        );

        // Use only absolute numbers
        chart.getNumberFormatter().set("numberFormat", "#.#s");

        // Add legend
        // https://www.amcharts.com/docs/v5/charts/xy-chart/legend-xy-series/
        let legend = chart.children.push(
            am5.Legend.new(root, {
                centerX: am5.p50,
                x: am5.p50
            })
        );

        // Create axes
        // https://www.amcharts.com/docs/v5/charts/xy-chart/axes/
        let yAxis = chart.yAxes.push(
        am5xy.CategoryAxis.new(root, {
            categoryField: "name",
            renderer: am5xy.AxisRendererY.new(root, {
            inversed: true,
            cellStartLocation: 0.1,
            cellEndLocation: 0.9
            })
        })
        );

        yAxis.data.setAll(props.chartData);

        let xAxis = chart.xAxes.push(
            am5xy.ValueAxis.new(root, {
                renderer: am5xy.AxisRendererX.new(root, {})
            })
        );


        createSeries(chart, root, xAxis, yAxis, "value", am5.p100, "right", -3);
        // createSeries("female", 0, "left", 4);

        // Add cursor
        // https://www.amcharts.com/docs/v5/charts/xy-chart/cursor/
        let cursor = chart.set("cursor", am5xy.XYCursor.new(root, {
            behavior: "zoomY"
        }));

        cursor.lineY.set("forceHidden", true);
        cursor.lineX.set("forceHidden", true);

        // Make stuff animate on load
        // https://www.amcharts.com/docs/v5/concepts/animations/
        chart.appear(1000, 100);



    return () => {
        root.dispose();
        };
    }, []);


    // Add series
    // https://www.amcharts.com/docs/v5/charts/xy-chart/series/
    function createSeries(chart: am5xy.XYChart, root: am5.Root, xAxis: am5xy.ValueAxis<AxisRenderer>, yAxis: am5xy.CategoryAxis<AxisRenderer>, field:any, labelCenterX:any, pointerOrientation:any, rangeValue:any) {
        let series = chart.series.push(
            am5xy.ColumnSeries.new(root, {
                xAxis: xAxis,
                yAxis: yAxis,
                valueXField: field,
                categoryYField: "name",
                sequencedInterpolation: true,
                // clustered: false,
                // tooltip: am5.Tooltip.new(root, {
                //     pointerOrientation: pointerOrientation,
                //     labelText: "{categoryY}: {valueX}"
                // })
            })
        );
        console.log('columns', series.columns);
        series.columns.template.adapters.add("fill", function(fill, target) {
            console.log('target', target.dataItem.get("valueX"));   // <- this is where the problem is
            if (target.dataItem.get("valueX") > 0) {
              return am5.color('#a4282a');
            }
            else {
               return am5.color('#3c6eb1');;
            }
          });


        series.columns.template.setAll({
            height: am5.p100
        });

        series.bullets.push(function() {
            return am5.Bullet.new(root, {
            locationX: 1,
            locationY: 0.5,
            sprite: am5.Label.new(root, {
                centerY: am5.p50,
                text: "{valueX}",
                populateText: true,
                centerX: labelCenterX
            })
            });
        });

        series.data.setAll(props.chartData);
        series.appear();


        let rangeDataItem = xAxis.makeDataItem({
            value: rangeValue
        });
        xAxis.createAxisRange(rangeDataItem);
        rangeDataItem.get("grid").setAll({
            strokeOpacity: 1,
            stroke: series.get("stroke")
        });

        let label = rangeDataItem.get("label");
        label.setAll({
            text: field.toUpperCase(),
            fontSize: "1.1em",
            fill: series.get("stroke"),
            paddingTop: 10,
            isMeasured: false,
            centerX: labelCenterX
        });
        label.adapters.add("dy", function() {
            return -chart.plotContainer.height();
        });

        return series;
    }


    return (
        <>
            <div id={props.chartContainer} style={{ width: "100%", height: "500px" }}></div>

        </>
    )

}

well, it's not the most elegant solution, but casting the target parameter as any satisfied the compiler enter image description here

I had a similar issue with a Heat Map https://www.amcharts.com/demos/heat-map-with-legend/, too. This was related to the value displayed in the legend. enter image description here

Type "visible" ?? value the name of the property in the data, so this should accept any string. enter image description here

By setting the "value" string as a type any, the error went away. Even though it's still a string . enter image description here

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

amCharts v5 模板适配器示例在作为 TypeScript 而不是 JavaScript 运行时抛出错误 的相关文章

  • rxjs/Subject.d.ts 错误:类“Subject”错误地扩展了基类“Observable

    我从中提取了示例模板代码本教程 https github com gopinav Angular 2 Tutorials并执行以下两个步骤来开始 npm install worked fine and created node module
  • TypeError: props.render 不是一个函数(React hook 形式)

    我将方法作为我用react hook form制作的形式的道具传递 当从react hook form添加控制器时 它给了我 TypeError props render不是一个函数 我在网上找不到任何解决方案 因此感谢任何帮助 impor
  • 在 Vue.js 中从父组件执行子方法

    目前 我有一个 Vue js 组件 其中包含其他组件的列表 我知道使用 vue 的常见方式是将数据传递给孩子 并从孩子向父母发出事件 但是 在这种情况下 我想在子组件中的按钮出现时执行子组件中的方法 parent被点击 哪种方法最好 一种建
  • 使用 useReducers 调度函数发送多个操作?

    使用时是否可以通过调度函数发送多个动作useReducer挂钩反应 我尝试向它传递一组操作 但这会引发未处理的运行时异常 明确地说 通常会有一个初始状态对象和一个减速器 如下所示 const initialState message1 nu
  • 可以使用 jQuery 或 Javascript 将图片的特定部分用作链接吗?

    我有这个想法 将图片 而不是文本 的各个部分链接到不同的页面或网站 并且我想在不实际创建不同的照片并将它们彼此靠近的情况下完成 这样看起来就像是一张完整的图片 这里有人知道如何使用 JavaScript 的变体 例如 jQuery 或纯 J
  • Javascript正则表达式用于字母字符和空格? [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我需要一个
  • 音频 blob 的 URL.createObjectURL 在 Firefox 中给出 TypeError

    我正在尝试从创建的音频 blob 创建对象 URLgetUserMedia 该代码在 Chrome 中可以运行 但在 Firefox 中存在问题 错误 当我打电话时stopAudioRecorder 它停在audio player src
  • 在requestAnimationFrame中使用clearRect不显示动画

    我正在尝试在 HTML5 画布上做一个简单的 javascript 动画 现在我的画布是分层的 这样当我收到鼠标事件时 背景层不会改变 但带有头像的顶层会移动 如果我使用 requestAnimationFrame 并且不清除屏幕 我会看到
  • 如何将 Google Charts 与 Vue.js 库一起使用?

    我正在尝试使用 Vue js 库使用 Google Charts 制作图表 但我不知道如何添加到 div 这是我尝试做的 这是如何使用普通 javascript 添加图表 这是文档的代码示例 https developers google
  • 表单计算器脚本基本价格未加载 OnLoad

    我的表单中有一个计算器来计算我的下拉选项选择 function select calculate on change calc input type checkbox calculate on click calc function cal
  • Firefox 书签探索未超过 Javascript 的第一级

    我已经编写了一些代码来探索我的 Firefox 书签 但我只获得了第一级书签 即我没有获得文件夹中的链接 e g 搜索引擎 雅虎网站 谷歌网站 在此示例中 我只能访问 Search engines 和 google com 不能访问 yah
  • firebase :: 无法读取 null 的属性“props”

    你好 我正在尝试将react router与firebase一起使用 但它给了我这个错误 无法读取 null 的属性 props 这正是代码 我正在其中使用我的反应路由器 向下代码位于作为登录面板组件的组件上 else if this em
  • Angular 2+ 安全性;保护服务器上的延迟加载模块

    我有一个 Angular 2 应用程序 用户可以在其中输入个人数据 该数据在应用程序的另一部分进行分析 该部分仅适用于具有特定权限的人员 问题是我们不想让未经授权的人知道how我们正在分析这些数据 因此 如果他们能够在应用程序中查看模板 那
  • 有没有办法阻止 prettier / prettier-now 将函数参数分解为新行

    当使用 prettier prettier now 在保存时进行格式化时 当一个函数包装另一个函数时 它会中断到一个新行 我想知道是否有办法阻止这种行为 例如 期望的输出 app get campgrounds id catchAsync
  • Javascript转换时区问题

    我在转换当前时区的日期时间时遇到问题 我从服务器收到此日期字符串 格式为 2015 10 09T08 00 00 这是中部时间 但是当我使用 GMT 5 中的 new Date strDate 转换此日期时间时 它返回给我的信息如下 这是不
  • 摆脱node-jsx

    在我的 NodeJS 应用程序的路由器中 我想渲染一个 React 应用程序 由于它没有被浏览器化 并且已反应 因此它返回unexpected token lt 构建时出错 我发现如果我require node jsx install 它不
  • 条件在反应本机生产中失败,但在开发中有效

    我创建了一个反应本机应用程序 我需要通过它进行比较 如果属实 就会执行死刑 问题是 该条件适用于 React Native 开发模式 而不适用于 React Native 生产版本 我使用 firebase 作为数据库 也使用 redux
  • Javascript 纪元时间(以天为单位)

    我需要以天为单位的纪元时间 迄今为止 我已经看到过有关如何翻译它的帖子 但几天后就没有了 我对纪元时间很不好 我怎么能得到这个 我需要以天为单位的纪元时间 我将解释为您想要自纪元以来的天数 纪元本身是第 0 天 或第 1 天的开始 无论您如
  • 问题:为什么React Native Video不能全屏播放视频?

    我正在react native 0 57 7 中为android和ios创建一个应用程序并使用反应本机视频 https github com react native community react native video播放上传到的视频
  • 为什么 jquery 没有检测到单选按钮未被选中的情况? [复制]

    这个问题在这里已经有答案了 可能的重复 JQuery radioButton change 在取消选择期间不会触发 https stackoverflow com questions 5176803 jquery radiobutton c

随机推荐

  • joomla模块开发与表单-如何处理

    我正在创建一个简单的 Joomla 2 5 模块 它将有一个 html 表单 mod mymodule tmpl default php
  • 不使用 sort 方法按字母顺序对数组进行排序

    我一直在学习 Chris Pine 的 Ruby 教程 目前正在研究一种无需使用即可对名称数组进行排序的方法sort 我的代码如下 它工作完美 但比我想象的更进一步 puts Please enter some names name get
  • 数组对象是否显式包含索引?

    从学习 Java 的第一天起 各种网站和许多老师就告诉我 数组是连续的内存位置 可以存储指定数量的相同类型的数据 由于数组是一个对象 并且对象引用存储在堆栈中 而实际对象位于堆中 因此对象引用指向实际对象 但是当我遇到如何在内存中创建数组的
  • 如何使用 AWS SAM 启用 CORS

    我正在尝试在我的 AWS SAM 应用程序中启用 CORS 这是我的片段template yaml Globals Api Cors AllowMethods AllowHeaders AllowOrigin Resources MyApi
  • Firebase 动态链接生成器中的 DFL 参数

    我需要使用 Android 上的 Dynamic Link Builder API 以编程方式构建动态链接 https firebase google com docs dynamic links android create https
  • 即使以管理员身份登录也无法删除文件[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 请有人告诉我我做错了什么 我正在尝试通过命令行删除隐藏文件夹 我以管理员身份运行命令行 但仍然收到消息访问权限不足 这是我的命令行的屏幕截
  • 是否可以以编程方式配对 Android 蓝牙设备?

    目前我正在使用 backport android bluetooth2 jar 文件与 Android 1 5 进行蓝牙编程 每当设备配对失败时 它都会填充 passKey 的警报对话框 如果我给出 passkey 那么在我的日志中我会收到
  • Android 调试监视器层次结构视图未显示

    我正在尝试在 ADM 中连接我的应用程序 但不幸的是层次结构视图未显示 我应该如何将我的应用程序连接到 ADM 工具 设备 Nexus 4 操作系统 4 3 3 Error 2014 02 06 13 00 14 hierarchyview
  • Visual C++ 和 *nix 环境下的编译差异

    在 nix 环境和 MS Visual C 环境中编译项目有区别吗 例如 Visual C 中有一个 stdafx h 文件 我问的原因是我提交了一段用g 编译的代码 重构mycode com http refactormycode com
  • Mac 上 -dpkg 的替代品是什么?

    我正在尝试使用 dpkg 命令 但在 Mac OS X 中它似乎对我不起作用 dpkg scanpackages m dev null gt Packages bash dpkg command not found dns Administ
  • Java:将格式化的xml文件转换为一行字符串

    我有一个格式化的 XML 文件 我想将其转换为一行字符串 我该怎么做 示例 XML
  • Delphi 'AND' 评估有 2 个条件

    我不得不选择 Delphi 来完成我最近正在做的一项合同工作 我希望有人澄清的一件事是条件语句中逻辑的执行 例如if 我有 C C 和这些语言的背景 一旦if已知语句失败 其余逻辑不会执行 例如 if somefunc FALSE anot
  • 如何检测设备的移动?

    我想检测像 Moo Box 这样的运动 我反转手机 当我将其转回时 它会触发一个动作 对于安卓 什么是最好的方法 可以自定义事件监听器 你看过吗传感器管理器 http developer android com reference andr
  • 如何在 R 中使用 as.Date() 格式化我的日期?

    我有一个如下所示的数据集 Date AE AA AEF Percent 1 1 2012 1211 1000 3556 0 03 1 2 2012 100 2000 3221 0 43 1 3 2012 3423 10000 2343 0
  • asp mvc 默认应用程序生成删除空格

    因此 当生成一个 mvc 项目时 它具有默认的母版页和部分视图 例如注册和登录视图 问题是 生成的母版页在页面左侧和右侧具有默认的空白 我的问题是 边距空间代码写在哪里以及如何删除它 虽然看起来很简单 但我似乎找不到它 Site css 保
  • 类型推断在具有静态成员约束的泛型类型上失败

    我定义了以下类型 从代码简化 type Polynomial lt a when a static member public Zero a and a static member a a gt a and a static member
  • MATLAB 搜索元胞数组中的字符串子集

    我试图在 MATLAB 的元胞数组中查找子字符串出现的位置 下面的代码可以工作 但是相当难看 在我看来应该有一个更简单的解决方案 cellArray these are some nicewords and some morewords w
  • 无可用来源

    我不确定发生了什么或者我是否做了什么 现在 每当我尝试调试时 它都会说所有 BCL 内容都没有可用的源代码 例如 在 debug print 上我收到该消息 定位源 f dd ndp fx src CompMod System Diagno
  • MFCC Python:librosa、python_speech_features、tensorflow.signal 的结果完全不同

    我正在尝试从音频 wav 文件 中提取 MFCC 特征 并且我已经尝试过python speech features and librosa但他们给出了完全不同的结果 audio sr librosa load file sr None l
  • amCharts v5 模板适配器示例在作为 TypeScript 而不是 JavaScript 运行时抛出错误

    我正在尝试根据值更改条形颜色 即在 JS 中很简单 https codepen io team amcharts pen KKmbKBg editors 1111 但是当我在 TSX 文件中实现代码时 它给了我一个错误 正如你所看到的 VS