Разрешено ли расширение пространства имен машинописи, если оно определено с помощью `export as namespace`? - PullRequest
0 голосов
/ 28 сентября 2018

Работая над проектом, который требует, чтобы я объявил новый модуль существующей библиотеки Javascript, однако при создании типизаций я заметил, что при попытке расширить пространство имен, как это предписывается в документации для машинописи , онполностью переопределяет предопределенное пространство имен.

Я не уверен, является ли это недопустимой операцией в машинописи или проблема с тем, как VSCode интерпретирует типизацию.

Пример:

// file: existing.d.ts
export as namespace A;
export class Foo {}

// file: extensions.d.ts
namespace A {
    export class Bar {}
}

// resulting intellisense output
A.Foo // doesn't exist
A.Bar // exists

Однако, если исходное объявление пространства имен изменено на формат namespace A {}, оно затем работает как положено.

Пример:

// file: existing.d.ts
namespace A {
    export class Foo {}
}

// file: extensions.d.ts
namespace A {
    export class Bar {}
}

// resulting intellisense output
A.Foo // exists
A.Bar // exists

Полагаю, главный вопрос в том, допустимо ли это даже в Typescript или это проблема с VSCode.

Ответы [ 2 ]

0 голосов
/ 29 сентября 2018

В первом примере existing.d.ts является модулем UMD , то есть внешним модулем, который также представляет себя как глобальный UMD A.Невозможно напрямую увеличить глобальный UMD.Вместо этого вы должны расширить базовый внешний модуль, написав declare module "module-name" { ... } внутри (1) файла, который содержит импорт или экспорт ES6 верхнего уровня и, следовательно, является внешним модулем или (2) фиктивным блоком declare module "dummy" { } в файле, которыйне является внешним модулем.Сделанные таким образом дополнения будут видны через глобальный UMD.

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

0 голосов
/ 28 сентября 2018

Я думаю, что разница в том, как вы объявили namespace A в своем existing.d.ts.

. В вашем первом примере вы, по сути, говорите: "У меня есть namespace A, а у меня class Foo объявлено вmy existing.d.ts "

Во втором примере вы, по сути, говорите:« У меня есть namespace A, и у меня есть class Foo, который принадлежит namespace A в моем existing.d.ts »

export as namespace A; только объявить пространство имен.

...