Typescript: экспорт экземпляра класса, который содержит состояние

У меня есть class MyStore, который содержит данные и состояние для моего JS-приложения. Я хочу получить один экземпляр при импорте этого класса в другие файлы (я использую внешние модули commonjs a.k.a).

Пример:

MyStore.ts

class MyStore extends BaseStore {
    private _items;
    getItems() { return _items; }
} 

export = MyStore;

Другой файл.ts:

import MyStore = require('./MyStore');
MyStore.getItems();

это не работает, так как мне нужно создать MyStore в Otherfile.ts

Мое текущее решение состоит в том, чтобы иметь статический одноэлементный метод:

MyStore.ts:

private static _instance = new MyStore();
static getInstance(){ return this._instance;}

Другой файл.ts

import MyStore = require('./MyStore');
MyStore.getInstance().getItems();

Есть ли лучший способ?

Изменить: причина, по которой это класс Typescript, заключается в том, чтобы разрешить наследование (расширение базового класса)


person Anders    schedule 26.08.2014    source источник
comment
@ steve-fenton Извините, этот вопрос не является дубликатом. Это специфично для машинописного текста. С не машинописными компонентами все работает как положено (можно экспортировать обычный объект)   -  person Anders    schedule 26.08.2014
comment
Это не дубликат. Это вопрос TypeScript, и вопрос, на который он был указан, - это JavaScript. Они связаны, но решение другое.   -  person Samuel Neff    schedule 26.08.2014
comment
Это ошибка приватного экспорта, которая будет исправлена ​​в версии компилятора github (v1.1). А пока интерфейсы являются обходным путем: bit.ly/1qphDqE   -  person Gorgi Kosev    schedule 26.08.2014
comment
@GorgiKosev, пожалуйста, добавьте свой комментарий в качестве ответа (если возможно, в противном случае проголосуйте за повторное открытие). Отличный ответ, спасибо!   -  person Anders    schedule 27.08.2014
comment
Да, я добавлю его, как только будет снят флаг дублирования.   -  person Gorgi Kosev    schedule 27.08.2014
comment
Извиняюсь - я подозревал, что то же самое исправление будет работать - я снова открыл.   -  person Fenton    schedule 27.08.2014


Ответы (1)


Это должно быть просто, верно?

class MyStore { ... }
// export a single instance
export = new MyStore(...);

К сожалению, typescript 1.0 этого не позволяет. Тип экспортируемых значений также должен быть экспортирован из модуля. В данном случае это побеждает весь смысл синглтонов.

Компилятор 1.1 (еще официально не выпущенный, но доступный на GitHub) исправляет это.

Тем временем обходным путем является использование слияния объявлений для экспорта интерфейса и реализации с одним и тем же именем:

class MyStoreImpl implements MyStore {
    private _items;
    getItems() { return this._items; }
}
interface MyStore {
    getItems();
}
var MyStore:MyStore = new MyStoreImpl();
export = MyStore;
person Gorgi Kosev    schedule 09.09.2014
comment
отличный! Мне пришлось поместить интерфейс в новый файл, чтобы заставить его работать. stackoverflow.com/questions/18794791/ - person Dustin Silk; 19.01.2016