2016-06-08 324 views
4

我有一個很難得到打字稿識別本地ES6模塊的形狀:Typescript找不到本地es6模塊;錯誤TS2307:找不到模塊

轉換-time.js

export const minutes = sec => sec * 60 
export const hours = sec => minutes(sec) * 60 
export const days = sec => hours(sec) * 24 
export const weeks = sec => days(sec) * 24 
export const years = sec => days(sec) * 365 

注:我想弄清楚如何在不改變convert-time.js的情況下使其工作。

這裏是我試圖將其導入到文件:

index.ts

/// <reference path="../typings/convert-time.d.ts" /> 

import { minutes, days } from '../test/helpers/convert-time' 

這裏是類型定義文件,我創建:

轉換時間.d.ts:

declare module "convert-time" { 
    export function minutes(sec: number): number; 
    export function hours(sec: number): number; 
    export function days(sec: number): number; 
    export function weeks(sec: number): number; 
    export function years(sec: number): number; 
} 

這裏是我的tsconfig:

tsconfig.json

{ 
    "compilerOptions": { 
    "module": "commonjs", 
    "noImplicitAny": false, 
    "removeComments": true, 
    "preserveConstEnums": true, 
    "sourceMap": true, 
    "jsx": "react" 
    }, 
    "files": [ 
    "typings/index.d.ts", 
    "typings/convert-time.d.ts" 
    ], 
    "exclude": [ 
    "node_modules" 
    ] 
} 

步驟嘗試:

無上述的工作!我必須學會怎樣才能讓這個工作成爲可能?謝謝!

+0

在你的'compilerOptions'你需要有'allowJs:TRUE'到允許JavaScript文件,否則它會報錯。 –

回答

2

關於ES6

與ES6模塊既然你想互操作你要麼」

一)更改tsconfig.json目標ES6和發射器ES6模塊是這樣的:

{ 
    ... 
    "target": "es6", 
    "module": "es6", 
    ... 
} 

但是,我不認爲你可以在NodeJS中使用ES6模塊。

或:

B)讓打字稿transpile的ES6的JavaScript模塊下降到ES5通過啓用JavaScript處理您的tsconfig.jsoncompilerOptions下 - 就像下面,並確保該.js文件包含/排除不:

{ 
    ... 
    "target": "es5", 
    "module": "commonjs", 
    "allowJs": true, 
    ... 
} 

關於你提到的類型聲明

有在讀我的博客上的打字稿如何發現分型/類型聲明,並希望在這裏看到:http://ivanz.com/2016/06/07/how-does-typescript-discover-type-declarations-definitions-javascript/

看來,這個JavaScript文件是你自己的代碼(不是NPM模塊),所以:

  1. 你不」噸需要的/// <reference path="../typings/convert-time.d.ts" />只要文件不排除或包括在tsconfig.json
  2. 確保convert-time.d.ts是在同一個目錄中convert-time.js
  3. 你並不需要聲明一個模塊,所以刪除declare module "convert-time" {位。這是因爲通過將.d.ts放在.js旁邊,它是一個「外部」模塊,而不是「環境」模塊(請參閱我的博客)(如果您正在創建自己生活的類型,您將需要declare位用於NPM封裝代碼)

基本上:

../test/helpers/convert-time.js:

export const minutes = sec => sec * 60 
export const hours = sec => minutes(sec) * 60 
export const days = sec => hours(sec) * 24 
export const weeks = sec => days(sec) * 24 
export const years = sec => days(sec) * 365 

../test/helpers/convert- time.ts.d:

export function minutes(sec: number): number; 
export function hours(sec: number): number; 
export function days(sec: number): number; 
export function weeks(sec: number): number; 
export function years(sec: number): number; 

index.ts:

import { minutes, days } from '../test/helpers/convert-time'; 

tsconfig.json(對於ES5 transpiling)

{ 
    "compilerOptions": { 
    "module": "commonjs", 
    "target": "es5", 
    "allowJs": true, 
    "noImplicitAny": false, 
    "removeComments": true, 
    "preserveConstEnums": true, 
    "sourceMap": true, 
    "jsx": "react" 
    }, 
    "files": [ 
    "/test/helpers/convert-time.ts.d", 
    "/test/helpers/convert-time.js", 
    "index.ts" 
    ] 
} 
+0

謝謝伊萬,詳細解釋!這確實幫助我更好地瞭解了typescript如何搜索類型定義。我擺脫了所有的環境定義和參考。構建步驟現在可以成功完成,但不幸的是,在運行時我會收到「Unexpected token export」。有任何想法嗎? –

+0

@Raine錯誤來自哪裏,代碼是什麼? –

+0

代碼與您指定的完全相同。服務器在運行時啓動時,會在convert-time.js中發生錯誤。它看起來需要額外的編譯步驟來將它們轉換爲commonjs模塊? –