2016-08-13 5 views
1

Очень простой модуль, который я создал для проверки жизнеспособности этого усилия. Вот начало SPServerApp.ts:Как создать модуль node.js с помощью машинописного текста

class SPServerApp { 
    public AllUsersDict: any; 
    public AllRoomsDict: any; 
    constructor() { 
     this.AllUsersDict = {}; 
     this.AllRoomsDict = {}; 
    } 
} 
module.exports = SPServerApp(); 

Тогда в моем приложении, у меня есть для этого требуется заявление:

var serverapp = require('./SPServerApp'); 

тогда я пытаюсь получить доступ к одному из словарей, как так:

serverapp.AllUsersDict.hasOwnProperty(nickname) 

Но получите ошибку:

TypeError: Cannot read property 'hasOwnProperty' of undefined

Может ли кто-нибудь увидеть, что я делаю неправильно здесь?

Спасибо, Е.

+0

Вы не инстанцировании класс. Добавьте «новый» или создайте новый экземпляр, в котором вы его требуете. – Phix

+1

Это действительно сработало. Спасибо, Фикс. –

+1

Я думаю, эта ссылка вам поможет. http://stackoverflow.com/questions/23739044/how-do-you-write-a-node-module-using-typescript –

ответ

2

Проблема заключается в том, что вы забыли «новый» ключевое слово при вызове конструктора. Строка должна гласить:

module.exports = new SPServerApp(); 

Если вы не используете нового вашего конструктора будет рассматриваться как нормальная функция и просто возвращаете неопределенной (так как вы ничего не возвращать явно). Также «this» не будет указывать на то, что вы ожидаете в конструкторе.

Опуская новый в узле на самом деле довольно распространен. Но для этой работы вы должны явно защититься от новых -Меньше вызовов в конструкторе следующим образом:

constructor() { 
    if (! (this instanceof SPServerApp)) { 
     return new SPServerApp(); 
    } 
    this.AllUsersDict = {}; 
    this.AllRoomsDict = {}; 
} 

Кстати, в машинописном вы также можете использовать синтаксис модуля. Компилятор TS переведет это в инструкции export/require. С модулями типа ES6 ваш пример будет выглядеть следующим образом:

export class SPServerApp { 
    public AllUsersDict: any; 
    public AllRoomsDict: any; 
    constructor() { 
     this.AllUsersDict = {}; 
     this.AllRoomsDict = {}; 
    } 
} 
export var serverapp = new SPServerApp(); 

В других ваших TS файл, который только импорт:

import { serverapp } from './SPServerApp'; 

serverapp.AllUsersDict.hasOwnProperty('something');