Я наткнулся на проблему с пространством имен при обновлении пакетов NPM до Angular 9. В случае, если библиотека использовалась приложением напрямую, все работало, как ожидалось, но в противном случае, в случае, если библиотека использовалась другой библиотекой, я столкнулся с сбой нулевого провайдера в ядре Angular.
ERROR TypeError: token.toString is not a function
at stringify (core.js:489)
at NullInjector.get (core.js:1076)
at R3Injector.get (core.js:16629)
at R3Injector.get (core.js:16629)
at R3Injector.get (core.js:16629)
at NgModuleRef$1.get (core.js:36024)
at R3Injector.get (core.js:16629)
at NgModuleRef$1.get (core.js:36024)
at Object.get (core.js:33773)
at getOrCreateInjectable (core.js:5805)
Проблема с этой ошибкой заключается в том, что она дает сбой в подпрограмме, которая должна регистрировать, с каким провайдером у нее возникла проблема, поэтому вы остаетесь в неведении, зная не более того, что провайдер не определен…
Решение
Наконец выяснилось, что у IVY есть проблема с методом, который я использовал для экспорта пространств имен.
// previous problematic export
barel.ts
// contains all the stuff exported under the namespace XYZ_FOO
export * from './model/models';
export * from './api/api';
index.ts
// this is how I defined my namespace in ng8 and before
import * as XYZ_FOO from './barel';
export {XYZ_FOO};
Экспорт пространств имен следующим образом решил проблему, и, честно говоря, выглядит намного лучше, чем предыдущее решение.
// new corrected export
xyz-foo.ts
// contains all the stuff exported under the namespace XYZ.FOO
export * from './model/models';
export * from './api/api';
index.ts
// updated way of exporting the namespace (works for both libs/apps)
import * as _foo from './xyz-foo';
import * as _bar from './xyz-bar';
export namespace XYZ{
export import FOO = _foo;
export import BAR = _bar;
}
Если у вас возникла та же проблема, я надеюсь, что это поможет вам.