2017-06-14 68 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的命名空間。

相關問題