2013-12-15 19 views
0

我正在嘗試爲要用於將文件上載到服務器的NodeJS強大模塊創建Typescript定義。但是這會引發錯誤。打字稿編譯器不編譯語句「import formidable = require('formidable');」到其等效的JavaScript。我需要知道這個強大的定義是否正確。試圖爲NodeJS模塊創建Typescript定義

下面是其中包含的文件解析代碼upload.ts:

import fs = require('fs'); 
import path = require('path'); 
import formidable = require('formidable'); 
var formidable = new formidable.Formidable(); 

這裏是它是由打字稿編譯器創建的upload.js:

var fs = require('fs'); 
var path = require('path'); 

var formidable = new formidable.Formidable(); 

的打字稿編譯器不創建要求聲明爲強大的模塊。這需要修復。

這裏的打字稿定義文件:

/// <reference path="../Main.d.ts" /> 

declare module "formidable" { 
    export interface Formidable { 
     IncomingForm(): Formidable; 
    } 
} 

回答

2

這裏的是怎麼回事:

因爲你Formidable模塊不包含任何(增值經銷商,類或含瓦爾或類模塊)它不會在「值空間」中創建名稱(Typescript有三個不同的名稱空間 - 類型,值和名稱空間)。

當你的東西,你會得到「所有含義」的進口價值。在這種情況下,因爲Formidable模塊中沒有值,導入不會在值空間中創建任何名爲formidable的對象。

然後你這樣做:

import formidable = require('formidable'); 
var formidable = new formidable.Formidable(); 

當解析表達式new formidable.Formidable(),編譯器查找名爲formidable值。它找到一個 - 你剛剛創建的var(沒有與導入名稱相同的變量 - 這在JavaScript代碼中不起作用...)。由於該變量在其自己的初始值設定項中使用,因此輸入推理僅使用any

本質上講,你所做的是這樣的:

var x = new x.y(); // ?? 

讓我們回到問題的根源,爲Formidable您的定義文件需要包括一些價值。它大概應該是這樣的(一類,而不是一個接口):

declare module "formidable" { 
    export class Formidable { 
     IncomingForm(): Formidable; 
    } 
} 
+0

這是一個非常完整的答案! – Fenton

+0

謝謝瑞恩!這是一個非常有用的答案。但是,由於另一個錯誤,我的代碼沒有解決。你可以看看這個問題嗎? http://stackoverflow.com/questions/20603247/unable-to-import-nodejs-module-into-typescript-code – EternallyCurious