如何使lodash.tonumber在Typescript中使用import()和commonjs单元测试?

时间:2017-06-14 12:18:15

标签: typescript

我的tsconfig.json是:

{
    "compilerOptions": {
        "target": "es5",
        "module": "esnext",
        "moduleResolution": "node",
        "allowSyntheticDefaultImports": true
    }
}

因为lodash.tonumber没有类型,所以我宣布它为:

// lib.d.ts
declare module "lodash.tonumber" {
    function toNumber(value: any): number;
    export = toNumber;
}

然后我导入库如:

// index.ts
/// <reference path="./lib.d.ts" />
import toNumber from "lodash.tonumber";
export { toNumber }

它与预期的import()完美配合。

当我想为index.ts添加单元测试时,因为它在nodejs上运行,所以我应该用tsconfig.json编译它,如:

{
    "compilerOptions": {
        "target": "esnext",
        "module": "commonjs",
        "allowSyntheticDefaultImports": true
    }
}

运行测试后,它显示错误:lodash_tonumber_1.default is not a function,生成的js文件为:

// index.js
/// <reference path="./lib.d.ts" />
var lodash_tonumber_1 = require("lodash.tonumber");
exports.toNumber = lodash_tonumber_1.default;

该文件说lodash.tonumber应该像:

一样使用
const toNumber = require("lodash.tonumber");
console.log(toNumber("123"));

所以生成的js文件错了,我的tsconfig.json在某个地方可能出错了,所以有什么不对?

我尝试将代码更改为:

// index.ts
/// <reference path="./lib.d.ts" />
import toNumber = require("lodash.tonumber");
export { toNumber }

对于单元测试(module = commonjs)的情况,它生成了正确的var toNumber = require("lodash.tonumber");,因此它可以工作;

但是对于我的普通模块= esnext构建,它崩溃了,因为它没有生成import toNumber from "lodash.tonumber";,运行时错误是ReferenceError: toNumber is not defined

我还检查了lodash.toNumber js代码:

function toNumber(value) {
  if (typeof value == 'number') {
    return value;
  }
  ...
}

module.exports = toNumber;

所以我的类型应该是正确的。

接下来我该怎么办?

1 个答案:

答案 0 :(得分:0)

DHL_DEVELOPER_ID

声明具有相同名称的命名空间。