【问题标题】:Trying to create Typescript definition for NodeJS module尝试为 NodeJS 模块创建 Typescript 定义
【发布时间】:2014-01-02 22:46:29
【问题描述】:

我正在尝试为要用于将文件上传到服务器的 NodeJS 强大模块创建 Typescript 定义。但这会引发错误。打字稿编译器不会编译语句“import formidable = require('formidable');”到它的 javascript 等价物。我需要知道强大的定义是否正确。

这是包含文件解析代码的upload.ts:

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

这是由 typescript 编译器创建的 upload.js:

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

var formidable = new formidable.Formidable();

typescript 编译器没有为强大的模块创建 require 语句。这需要修复。

这是打字稿定义文件:

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

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

【问题讨论】:

    标签: typescript


    【解决方案1】:

    这是怎么回事:

    因为您的Formidable 模块不包含任何(变量、类或包含变量或类的模块),所以它不会在“值空间”(Typescript具有三个不同的命名空间 - 类型、值和命名空间)。

    当您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;
        }
    }
    

    【讨论】:

    • 这是一个非常彻底的答案!
    • 谢谢瑞恩!这是一个非常有帮助的答案。但是,由于另一个错误,我的代码没有解决。你能看看这个问题吗? stackoverflow.com/questions/20603247/…
    猜你喜欢
    • 2016-02-09
    • 2014-11-02
    • 1970-01-01
    • 2015-05-19
    • 1970-01-01
    • 1970-01-01
    • 2013-09-25
    • 2016-06-23
    • 1970-01-01
    相关资源
    最近更新 更多