Декоратор подключается к конструктору, как и ожидалось, но когда создается AppComponent
, инжектор пытается разрешить провайдер и вылетает.
Я думаю, что сообщение об ошибке является просто обобщенным c ошибка, когда компонент не удается создать, но ошибка возникает, когда Angular пытается получить инъекции для конструктора AppComponent
.
Если вы зарегистрируете конструктор для службы, вы увидите, что поставщик метаданные были прикреплены:
@InjectableEnhanced()
export class MyService {
constructor() {
}
}
console.log((MyService as object).prototype.constructor.hasOwnProperty('ɵprov'));
// prints "true"
Когда я пытаюсь проверить это свойство, оно вызывает ошибку:
try {
console.log((MyService as object).prototype.constructor.ɵprov);
} catch (err) {
console.log(err); // prints the same error message
}
Я думаю, что это свойство getter , которое разрешается к экземпляру провайдера, и именно это приводит к сбою.
Самая близкая проблема на Angular, которую я мог найти, была эта, но она все еще открыта:
https://github.com/angular/angular/issues/31495
Так что я чувствую, что компилятор Ivy может искать в исходном коде @Injectable()
и формировать список ожидаемых провайдеров, и он не видит этот новый декоратор поэтому MyService
исключен из списка. Позже во время выполнения метаданные для декоратора есть, но инжектор не знает, для чего он, и вылетает.
Я попытался найти что-то задокументированное, где вы могли бы зарегистрировать новый декоратор с помощью компилятора Ivy. , но не смог, и я не знаю, существует ли такая вещь.
К вашему сведению: я делаю ту же самую вещь на одном из моих других проектов, поэтому я думаю, что многие люди будут затронуты этим.