UNPKG

967 BPlain TextView Raw
1import {Injector, ReflectiveInjector, Type} from '@angular/core';
2
3import {isInjectable} from '../platform/module/metadata/decorators';
4
5export type InjectorFunction<R> = (injector: Injector, ...args) => R;
6
7export const typeToInjectorFunction = <T, R>(classOrFunction: Type<T> | InjectorFunction<R>, execute: (instance: T) => R): InjectorFunction<R> => {
8 try {
9 if (isInjectable(classOrFunction as Type<T>) === false) {
10 return <InjectorFunction<R>> classOrFunction;
11 }
12 else {
13 return instantiator<T, R>(classOrFunction as Type<T>, execute);
14 }
15 }
16 catch (exception) {
17 return <InjectorFunction<R>> classOrFunction;
18 }
19};
20
21const instantiator = <T, R>(type: Type<T>, execute: (instance: T) => R): (injector: Injector) => R => {
22 return (injector: Injector) => {
23 const descendantInjector = ReflectiveInjector.resolveAndCreate([type], injector);
24
25 const reader = descendantInjector.get(type);
26
27 return execute(reader);
28 };
29};