fix(ivy): allow abstract directives to have an invalid constructor (#32987)
For abstract directives, i.e. directives without a selector, it may happen that their constructor is called explicitly from a subclass, hence its parameters are not required to be valid for Angular's DI purposes. Prior to this commit however, having an abstract directive with a constructor that has parameters that are not eligible for Angular's DI would produce a compilation error. A similar scenario may occur for `@Injectable`s, where an explicit `use*` definition allows for the constructor to be irrelevant. For example, the situation where `useFactory` is specified allows for the constructor to be called explicitly with any value, so its constructor parameters are not required to be valid. For `@Injectable`s this is handled by generating a DI factory function that throws. This commit implements the same solution for abstract directives, such that a compilation error is avoided while still producing an error at runtime if the type is instantiated implicitly by Angular's DI mechanism. Fixes #32981 PR Close #32987
This commit is contained in:
@ -48,15 +48,15 @@ export function compileInjectable(type: Type<any>, srcMeta?: Injectable): void {
|
||||
get: () => {
|
||||
if (ngFactoryDef === null) {
|
||||
const metadata = getInjectableMetadata(type, srcMeta);
|
||||
ngFactoryDef =
|
||||
getCompilerFacade().compileFactory(angularCoreDiEnv, `ng:///${type.name}/ɵfac.js`, {
|
||||
name: metadata.name,
|
||||
type: metadata.type,
|
||||
typeArgumentCount: metadata.typeArgumentCount,
|
||||
deps: reflectDependencies(type),
|
||||
injectFn: 'inject',
|
||||
isPipe: false
|
||||
});
|
||||
const compiler = getCompilerFacade();
|
||||
ngFactoryDef = compiler.compileFactory(angularCoreDiEnv, `ng:///${type.name}/ɵfac.js`, {
|
||||
name: metadata.name,
|
||||
type: metadata.type,
|
||||
typeArgumentCount: metadata.typeArgumentCount,
|
||||
deps: reflectDependencies(type),
|
||||
injectFn: 'inject',
|
||||
target: compiler.R3FactoryTarget.Pipe
|
||||
});
|
||||
}
|
||||
return ngFactoryDef;
|
||||
},
|
||||
|
Reference in New Issue
Block a user