Экспорт констант по умолчанию TypeScript

У нас есть библиотека TypeScript, которую мы публикуем в частной среде NPM, и мы хотим использовать эту библиотеку в других проектах TS, ES6 или ES5.

Пусть библиотека будет пакетом npm с именем foo, его основной файл работает как бочка, выполняя следующие действия:

// Index.ts
import Foo from './Core/Foo';

export {default as Foo} from './Core/Foo';

const foo = new Foo();

export default foo;

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

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

// foo.d.ts
declare namespace Foo {
  export class Foo {
    public constructor()
    // ...methods
  }

  const foo: Foo;

  export default foo;
}

declare module 'foo' {
  export = Foo;
}

Не удалось запустить тесты с error TS1063: An export assignment cannot be used in a namespace.

Я стремлюсь к тому, чтобы использовать экземпляр по умолчанию следующим образом:

// ES5, browser env
window.Foo.foo.someMethod();

// ES6/TS
import foo from 'foo';

foo.someMethod();

Есть идеи, есть ли правильный способ сделать это?

ИЗМЕНИТЬ

Объявление только модуля, как предлагал @ daniel-rosenwasser, раньше работало, но возникла проблема, когда мы попытались создать новый модуль, расширяющий первый.

Например:

// bar.d.ts
/// <reference path="../foo/foo.d.ts"/>

import {
  Foo
} from 'foo';

declare module 'bar' {
  export class Bar extends Foo {
    public constructor();
    // more methods
  }
}

И его тесты:

// bar-tests.ts
/// <reference path="../foo/foo.d.ts"/>
/// <reference path="./bar.d.ts"/>

import foo, {
  Foo
} from 'foo';

import {
  Bar
} from 'bar';

namespace TestBar {
  {
    let result: Foo;
    result = foo;
  }

  {
    let result: Foo;
    result = new Bar();
  }
}

На этот раз ошибки следующие:

bar/bar-tests.ts: error TS2307: Cannot find module 'bar'.
bar/bar.d.ts: error TS2664: Invalid module name in augmentation, module 'bar' cannot be found.

person RecuencoJones    schedule 23.09.2016    source источник
comment
это может помочь stackoverflow.com/a/59941420/4378475   -  person Inzamam Malik    schedule 28.01.2020


Ответы (1)


Сообщение об ошибке здесь неправильное, поэтому я открыл для вас проблему: https://github.com/Microsoft/TypeScript/issues/11092

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

declare module "foo" {
    export class Foo {
        public constructor()
        // ...methods
    }

    const foo: Foo;

    export default foo;
}
person Daniel Rosenwasser    schedule 23.09.2016
comment
Да, это в значительной степени то, что у меня было раньше, но проблема возникла позже, когда я попытался создать новый модуль, расширяющий этот, добавляю образец к вопросу ... - person RecuencoJones; 23.09.2016
comment
В другом модуле синтаксис declare module "foo" {} создает расширение модуля. причина того, что вы находитесь в другом модуле, заключается в том, что у вас есть импорт верхнего уровня. Вы можете переместить импорт в declare module bar`, чтобы он работал правильно. - person Daniel Rosenwasser; 23.09.2016
comment
Это сработало! Я не понимал, что операторы импорта должны быть внутри объявления модуля, спасибо, Даниэль! - person RecuencoJones; 24.09.2016