【问题标题】:cannot use function from js in typescript无法在打字稿中使用来自 js 的函数
【发布时间】:2022-01-24 19:50:19
【问题描述】:

我有一个计算多边形面积的函数,这是我的函数

import {distance} from "mathjs"
function getArea(arrayCord) {
    let triangle =[]
    let area = 0.0
    let a =0.0
    let b =0.0
    let c =0.0
    let s =0.0
    for (let i = 0; i < arrayCord.length-2; i++) {
        a = distance(arrayCord[i],arrayCord[i+1])// p1-p2
        b = distance(arrayCord[i+1],arrayCord[i+2]) //p2 - p3
        c = distance(arrayCord[i],arrayCord[i+2]) //p3-p1
        s = (a+b+c)/2;
        triangle[i] = Math.sqrt(s*(s-a)*(s-b)*(s-c))
        area+= triangle[i]
    }
    return area;
}

当我将函数复制到打字稿类中并使用它时,我收到了这个错误提示

运算符 '+' 不能应用于类型 'number | math.BigNumber' 和 '数字 |数学.BigNumber'

我的打字稿中的函数是


          const getArea = (arryy:(number|undefined)[][]) =>{
            let triangle =[]
            let area = 0.0
            let a:(number|BigNumber) =0.0
            let b:(number|BigNumber) =0.0
            let c:(number|BigNumber) =0.0
            let s:(number|BigNumber) =0.0
            for (let i = 0; i < arryy.length-2; i++) {
              a = distance(arryy[i],arryy[i+1])// p1-p2
              b = distance(arryy[i+1],arryy[i+2]) //p2 - p3
              c = distance(arryy[i],arryy[i+2]) //p3-p1
              s = (a+b+c)/2;
              triangle[i] = Math.sqrt(s*(s-a)*(s-b)*(s-c))
              area+= triangle[i]
            }
            return area;
        }

如何解决这个问题,以便我可以在我的 typescript 类上使用我的函数?

【问题讨论】:

  • 您必须先将数字转换为 BigNumber,然后才能添加它们。所以做一个类型检查,然后在保证两者是相同类型时添加。
  • 转换过程怎么做?
  • 要从BigNumber转换为BigNumber,请参阅conversion section of the API
  • 为什么要在 TS sn-ps 中添加 BigNumber?你似乎没有使用BigNumber 如果你需要对它们运行计算,你不能使用+,你必须调用math.add

标签: javascript typescript mathjs


【解决方案1】:

numberBigNumber 被视为两种数据类型,Typescript 不知道允许这种加法操作。所以在你的情况下,a 可能是 numberb 可能是 BigNumber

如果您确定这些可以添加在一起,您可以在显示错误的注释上方的行中使用// @ts-ignore I'm sure this adds

【讨论】:

  • 建议忽略 TS 的警告让我畏缩。这应该是一条评论,您并没有真正回答问题,而是提供了一种解决方法,假设某些事情可能不正确(您不能使用 + 添加数字和 BigNumbers)
  • 各有各的。如果她发现花时间尝试了解 TS 的怪癖更有用,但为了 TS 的纯度,无论多么不合逻辑或不方便,那么您的答案就很好。如果她觉得这个怪癖是在浪费她的时间,@ts-ignore 是她反对 TS 逻辑工作方式的一种完全有效的方式。
【解决方案2】:

您不能对BigNumbers 使用常规算术。

替换

s = (a+b+c)/2

s = math.divide(math.add(a, b, c), 2)

但您需要注意math.divide 返回number | BigNumber | Fraction | Complex | Unit | Array | Matrix,因此您的s 可能需要调整其类型。

见:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-27
    • 2023-02-07
    • 1970-01-01
    • 1970-01-01
    • 2018-08-02
    • 2019-01-21
    • 2023-02-17
    相关资源
    最近更新 更多