将NodeJ导入TypeScript编译错误

时间:2017-01-31 23:15:25

标签: javascript node.js typescript

我正在尝试使用声明(d.ts)文件将nodejs类导入typescript代码。 为了测试它,我创建了一个简单的nodejs类,声明文件和要导入(使用)nodejs类的typescript文件。

TS_PROJECT / node_modules / newtest / index.js的内容:

var HelloWorld = function() {

}

HelloWorld.hello2 = function() {
  console.log("hello2");
}

HelloWorld.prototype.hello1 = function() {
  console.log("hello1");
}

module.exports = HelloWorld;

正如您所看到的,它是一个具有成员函数“hello1”和静态函数“hello2”的类。

现在我正在尝试在TS_PROJECT / newtest / index.d.ts中声明它:

declare module newtest {
    export class HelloWorld {
        hello1():void;
        static hello2():void;
    }
}
export = newtest;

最终尝试从index.ts中消费它:

/// <reference path="./newtest/index.d.ts" />
import * as mymodule from "newtest";

现在我正在尝试实例化对象并调用函数,但无论我尝试它还是不编译。我尝试了很多变化,但没有一个有效。例如:

    // Doesn't Work 
    import HelloWorld = mymodule.HelloWorld;
    let s: HelloWorld = new HelloWorld();
    // It results with the following compile errors:
    // error TS2339: Property 'HelloWorld' does not exist on type 'typeof "newtest"'.
    // error TS2694: Namespace '"newtest"' has no exported member 'HelloWorld'.

我不会列出其余的所有变体。但如果有人能帮助我正确声明和实例化对象,我将不胜感激。

谢谢!

2 个答案:

答案 0 :(得分:0)

您不需要import类型,因为您已经从模块导入了所有内容并将其命名为mymodule。你可以做几件事:

  1. 直接导入课程:

    import { HelloWorld } from 'newtest'
    let s:HelloWorld = new HelloWorld();
    
  2. 从导入的模块中访问类型:

    import * as mymodule from 'newtest';
    let s:mymodule.HelloWorld = new mymodule.HelloWorld();
    
  3. 创建对类型的本地变量引用:

    import * as mymodule from 'newtest';
    const HelloWorld = mymodule.HelloWorld;
    let s = new HelloWorld();
    

答案 1 :(得分:0)

我想我找到了答案。在我的示例中,声明模块“newtest”表示导出的nodejs对象。由于导出的对象已经是HelloWorld对象,因此在另一个类HelloObject中定义是错误的。 因此,最简单的解决方案是使用nodejs代码,如:

element.style {
height: 440px;
-touch-action: pan-y;
-webkit-user-drag: none;
 -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
     }

这样我们就可以导出一个内部有HelloWorld类的对象。这修复了编译和编译的JS。

我在声明文件“newtest”中的另一个问题必须是引号。只有这样它才能将模块附加到nodejs包。

这些修复解决了我的问题。但问题仍然存在。如果我仍然需要使用“module.exports = HelloWorld;”怎么办?在这种情况下我应该如何声明这个模块?