2013-12-15 2 views
0

Я пытаюсь создать определение Typcript для грозного модуля NodeJS, который я хочу использовать для загрузки файлов на сервер. Но это вызывает ошибку. Компилятор typescript не компилирует оператор «import formidable = require ('formidable'); к его эквиваленту javascript. Мне нужно знать, правильное определение грозное.Пытается создать определение дескриптора для модуля NodeJS

Вот в 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(); 

Машинопись компилятор не создает require statement для грозного модуля. это необходимо исправить.

Вот файл определения машинопись:

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

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

ответ

2

Вот что происходит:

Поскольку ваш Formidable модуль не содержит каких-либо значения (ПОСРЕДНИКОВ, классы или модули, содержащие ВАР или классы) , он не создает имя в «пространстве значений» (TypScript имеет три разных пространства имен - типы, значения и пространства имен).

Когда вы получаете import, вы получаете «все значения» импортируемого значения. В этом случае, поскольку в модуле 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

Смежные вопросы