0

我正在尝试在typescript svelte 3 应用程序中使用big.jstoFormat 。正如 GitHub 页面上所解释的,我已经安装了来自definitelyTyped 项目的类型:

npm install big.js
npm install toformat
npm install --save-dev @types/big.js

但是,toFormat 没有类型定义;所以我写了自己的:

// toformat.d.ts
declare module 'toformat' {
    import type { BigConstructor, Big, BigSource } from 'big.js';

    export interface Decimal extends Big {
        toFormat(dp: number, rm?: number, fmt?: Object): string;
    }

    export interface DecimalConstructor extends BigConstructor {
        new (value: BigSource): Decimal;
    }

    export default function toFormat(ctor: BigConstructor): DecimalConstructor;
}

现在我可以像下面那样使用 big.js 和 toFormat (有效):

import toFormat from 'toformat';
import Big from 'big.js';
const Decimal = toFormat(Big);
console.log(new Decimal(12500.235).toFormat(2));

但是,我不想每次使用时都执行 toFormat,而是希望使用以下更简单的语法:

import Decimal from '../utilities/decimal'; // both type and value are imported here
let amount: Decimal;
amount = new Decimal(23.152);
console.log(amount.toFormat(2));

为此,我创建了 /utilities/decimal.ts 文件:

import Big from 'big.js';
import toFormat from 'toformat';
export type { Decimal } from 'toformat';
export default toFormat(Big);

现在的问题是import Decimal from '../utilities/decimal';确实导入了 DecimalConstructor,但没有导入 Decimal 接口。我看到import Big from 'big.js';导入了 Big 接口和 BigConstructor;所以似乎可以将我的 Decimal 接口和 DecimalConstructor 放在同一个Decimal名称下。有人可以帮我弄这个吗?

更新:顺便说一句,以下工作:

import type { Decimal } from '../utilities/decimal';
import DecimalConstructor from '../utilities/decimal';
let amount: Decimal;
amount = new DecimalConstructor(23.152);
console.log(amount.toFormat(2));

我想要实现的是以与默认导入相同的名称导入 Decimal 和 DecimalConstructor 。

4

1 回答 1

0

经过一些试验和错误后,我使它按以下方式工作:

// /utilities/decimal.ts
import Big from 'big.js';
import toFormat from 'toformat';
import type { Decimal as Dec } from 'toformat';

const Constructor = toFormat(Big);
export const Decimal = Constructor;

// 'export default from' is not possible.
// See https://github.com/microsoft/TypeScript/issues/35010
// and https://github.com/tc39/proposal-export-default-from
export interface Decimal extends Dec { }
export default Decimal;

理想情况下,我不想重新声明 Decimal 接口,但我找不到更好的方法。

于 2022-02-22T14:26:51.850 回答