Как экспортировать экземпляр класса в Typescript

Я создаю библиотеку TS и хотел бы экспортировать экземпляр класса, я намереваюсь использовать его как синглтон в приложении-потребителе.

Сейчас у меня следующая структура:

index.ts

export { Foo } from './my-class';

foo.ts

export class Foo {
  functionA() {}
}

Затем я встраиваю в формат UMD, используя webpack и babel, а в другом приложении (Angular) я могу импортировать в свой класс, создавать его экземпляры и использовать соответственно.

import { Foo } from 'foo';

private foo = new Foo();

const x = foo.functionA();

Есть ли способ вернуть экземпляр моего класса или я неправильно об этом думаю?

Таким образом, вместо того, чтобы делать new Foo(), импортированный Foo уже будет экземпляром?

Спасибо

ОБНОВЛЕНИЕ Я должен был упомянуть, что я экспортирую другие вещи, такие как интерфейсы, поэтому я не думаю, что экспорт класса по умолчанию был бы правильным путем? – см. здесь


person mindparse    schedule 24.01.2019    source источник


Ответы (4)


Вы можете контролировать то, что вы возвращаете так:

// Export the named class directly
export class Foo { }

// Export the named class indirectly
class Bar { }
export { Bar }

// Export an instance of the class directly
export const foo = new Foo();

// Export an instance of the class indirectly
const bar = new Bar();
export { bar };

Вот Ссылка на TypeScript Playground, показывающая компилируемый код и созданный javascript.

Официальная документация TypeScript Handbook по экспорту (а также импорту и реэкспорту): https://www.typescriptlang.org/docs/handbook/modules.html#export

Документация MDN (любезно предоставлена ​​jo_va): https://developer.mozilla.org/en-US/docs/web/javascript/reference/statements/export

И вот руководство Basarat для них: https://basarat.gitbooks.io/typescript/docs/project/modules.html

person Community    schedule 24.01.2019

Да, это вполне возможно, и это стандартный способ сделать это и в TS.

export default new Foo();

Однако, если вы хотите импортировать не только этот экземпляр, но и интерфейсы, вы должны экспортировать синглтон следующим образом:

export const foo = new Foo();

Вы можете найти export документ здесь

person jo_va    schedule 24.01.2019
comment
Спасибо, я обновил свой вопрос, так как я не думаю, что экспорт по умолчанию - это то, что мне нужно, поскольку я также экспортирую другие вещи, такие как интерфейсы. - person mindparse; 24.01.2019

Если вам нужен только синглтон, вы должны придерживаться соглашения о синглтоне,

  export class Foo {
    private static _instance = new Foo();
    private constructor() {

    }

    static get instance() {
      return this._instance;
    }

  }

  export const foo = Foo.instance;
person ABOS    schedule 24.01.2019
comment
Выбранный ответ будет работать и для синглтонов. Принципы других языков не обязательно подходят для JavaScript. - person RA.; 16.07.2019
comment
Мне нравится этот ответ, который демонстрирует, как написать синглтон в js. У меня были некоторые проблемы при экспорте экземпляра (не одноэлементного), а затем import из нескольких мест приводит к тому, что файл выполняется несколько раз (console.log() на верхнем уровне в этом файле запускается несколько раз). - person Shaung Cheng; 28.02.2020
comment
Также есть статья в журнале Visual Studio о том, как подробно написать синглтон с помощью частного конструктора: visualstudiomagazine.com/articles/2016/12/01/ - person Shaung Cheng; 08.03.2020
comment
@ShaungCheng import следует кэшировать после первого импорта. Если к принятому ответу был добавлен console.log, вы увидите его только один раз. Если вы видите несколько console.logs, это заставляет меня думать, что вы выполняете фабричную функцию. - person Alex; 01.08.2020

Можно экспортировать экземпляр класса Members.

Экспортируйте экземпляр класса следующим образом: export const playerRoutes = new Routes

Экспортируйте класс следующим образом: export class player

person amul klinton    schedule 24.01.2019