2017-01-31 4 views
1

Я пытаюсь импортировать класс nodejs в код машинописного текста с использованием файла декларации (d.ts). Чтобы проверить это, я создал простой класс nodejs, файл декларации и файл машинописного текста, который будет импортировать (потреблять) класс 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'. 

Я не буду перечислять все остальные варианты. Но я был бы признателен, если бы кто-нибудь мог помочь мне с надлежащим объявлением и созданием объекта.

Спасибо!

+0

Нам нужны некоторые сообщения об ошибках, чтобы даже начать выяснять, что происходит – rossipedia

+0

Хорошо, я добавил сообщения об ошибках в сообщение. Но я упрощу вопрос. Каким будет подходящий способ сделать объявление для класса HelloWorld и создать его экземпляр? – yuriscom

ответ

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(); 
    
+0

Благодарим вас за ответ. Но это приводит к тем же ошибкам: Ошибка компиляции: ошибка TS2305: модуль «newtest» не имеет экспортированного члена «HelloWorld». И тогда, если вы все еще запускаете код: [1] var s = new newtest_1.HelloWorld(); [1]^ [1] [1] ТипError: newtest_1.HelloWorld не является конструктором – yuriscom

+0

Я считаю, что мое объявление неверно. По-видимому, он не экспортируется должным образом – yuriscom

+0

Какую версию TypeScript вы используете? На самом деле я не смог воспроизвести это с использованием текущей версии 2.1.5 – rossipedia

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;»? Как объявить этот модуль в этом случае?

+0

Я думаю, что в этом случае 'export default HelloWorld;' будет тем, что вы хотите – rossipedia

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