2017-06-14 23 views
2

我tsconfig.json是:如何使lodash.tonumber与Typescript中的import()和commonjs单元测试一起工作?

{ 
    "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文件是:

const toNumber = require("lodash.tonumber"); 
console.log(toNumber("123")); 

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

该文件称的lodash.tonumber应该像使用

所以生成的js文件是错误的,我的tsconfig.json可能在某处出错了,所以怎么了?

我试图改变代码:

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

对于单元测试(模块= 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; 

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

接下来我该做什么?

回答

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

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

相关问题