【问题标题】:Use TypeScript to trigger a compile error when BigNumber.toString is used?使用 BigNumber.toString 时使用 TypeScript 触发编译错误?
【发布时间】:2019-03-05 23:58:59
【问题描述】:

如果调用BigNumber.toString,是否可以使用TypeScript触发编译时错误?

具体来说,我的应用程序遇到了错误,因为BigNumber.toString() 将用科学计数法表示足够大和足够小的数字:

> x = new BigNumber('0.00000000001')
> x.toString()
'1e-10'
> x.toFixed()
'0.00000000001'

我尝试过覆盖类型:

import {BigNumber} from "bignumber.js";

declare module "bignumber.js" {
  interface BigNumber {
    toString: never
    someOtherThing: number
  }
}

但这似乎不起作用(并且添加了someOtherThing 字段,所以我知道正在加载类型定义)

如果使用BigNumber.toString,如何触发编译错误?

(另外,请注意:我设置了BigNumber.config({ EXPONENTIAL_AT: 1e+9 }) 并重载了BigNumber.toString,因此它会发出警告,但如果添加编译错误会很好)

【问题讨论】:

  • 我无法遵循您的代码..您正在导入BigNumber,但随后立即将同名声明为接口。这不应该被允许编译。我知道您正在尝试覆盖该类型,但我不希望这是应该这样做的。如果我错了,请纠正我,如果是这样,我很想学习。我会创建自己的类,它使用 BigNumber,包装方法,并为toString 方法返回''
  • @StevenStark 这是用于扩展接口的 TypeScript 语法(滚动到“Augmenting”):typescriptlang.org/docs/handbook/declaration-merging.html
  • 谢谢,我没有意识到这只是一个 TS 约定。这些天我一直在专门使用 Flow。

标签: javascript typescript bignum


【解决方案1】:

如果调用 BigNumber.toString 是否可以使用 TypeScript 触发编译时错误

几个选项

创建自定义 linter 规则

关于 tslint 的文档:https://palantir.github.io/tslint/develop/custom-rules/ 您的自定义规则将是类型检查规则:https://palantir.github.io/tslint/usage/type-checking/

并将BigNumber 上的toString 调用更改为错误。

在安装时编辑类型

通过编辑已安装的 .d.ts 从 BigNumber 中删除 toString 方法并使用 PatchPackage 提交它:https://github.com/ds300/patch-package

创建一个包装器

或者创建一个围绕 BigNumber 的包装器,它不会向您的开发人员公开任何您认为危险的东西 ?

想法

我个人会使用补丁包作为更简单的方法。如果您正在使用该库进行大量财务工作,那么请考虑为您的用例使用包装器。

【讨论】:

  • 作为补丁包的替代方法,也可以在运行时对库进行猴子补丁:GitHub issue
猜你喜欢
  • 1970-01-01
  • 2018-12-06
  • 2016-12-08
  • 1970-01-01
  • 2015-09-14
  • 1970-01-01
  • 2019-08-01
  • 1970-01-01
相关资源
最近更新 更多