У нас есть библиотека 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.