Typescript не будет компилироваться, если расширение модуля через объявление пространств имен окружения не будет импортировано. Отлично!
Мне трудно заставить веб-пакет сделать то же самое.
Пространство имен / модуль:
// MyNamespace.ts
export class MyClass
{
constructor()
{
console.log('MyClass');
}
}
Файл, дополняющий его:
// MyClassPatch.ts
import * as MyNamespace from './MyNamespace';
declare module './MyNamespace'
{
interface MyClass
{
Patch(): void;
}
}
MyNamespace.MyClass.prototype.Patch = function()
{
console.log('Patched');
};
Другой файл:
// index.ts
import * as MyNamespace from './MyNamespace';
//import './MyClassPatch'; notice that line!
const myClass = new MyNamespace.MyClass();
myClass.Patch();
И он прекрасно компилируется! Конечно, выдает ошибку времени выполнения, потому что MyClassPatch
не импортируется.
Я создал простое хранилище (https://github.com/chadiik/ts-ambient-declarations), пробуя разные загрузчики Typescript (потому что я думал, что проблема в этом). Npmследующие сценарии:
- "no-bundle": скомпилируется с Typescript (tsc) и завершится ошибкой. (Ожидается)
- "bundle-atl": скомпоновается с веб-пакетом, используяawesome-typescript-loader и success (не ожидается!)
- "bundle-bl": объединить с веб-пакетом с помощью babel-loader и успешно (не ожидается!)
- "bundle-tl": будет в комплекте с веб-пакетом, используя ts-loader, и преуспеет (не ожидается!)
Какие изменения конфигурации мне нужно внести в веб-пакет? Или это ошибка?
PS:Мне удалось обойти это, добавив * .patch.ts к моим patch именам файлов и добавив исключение в tsconfig: "** / *. Patch.ts", но это добавляет другие проблемыс intellisense в vscode (ветка 'patch-exclude' в репо)?
Спасибо