Я наткнулся на проблему с пространством имен при обновлении пакетов 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; }
Если у вас возникла та же проблема, я надеюсь, что это поможет вам.