首页 文章

将NodeJ导入TypeScript编译错误

提问于
浏览
1

我试图使用声明(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

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

    • 直接导入该类:
    import { HelloWorld } from 'newtest'
    let s:HelloWorld = new HelloWorld();
    
    • 从导入的模块访问类型:
    import * as mymodule from 'newtest';
    let s:mymodule.HelloWorld = new mymodule.HelloWorld();
    
    • 创建对类型的局部变量引用:
    import * as mymodule from 'newtest';
    const HelloWorld = mymodule.HelloWorld;
    let s = new HelloWorld();
    
  • 0

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

    var HelloWorld = function () {
    
        }
    
        HelloWorld.hello2 = function () {
          console.log("hello2");
        }
    
        HelloWorld.prototype.hello1 = function () {
          console.log("hello1");
        }
    
        // Only this part changed
        module.exports.HelloWorld = HelloWorld;
    

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

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

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

相关问题