##// END OF EJS Templates
dependency builder proposal
dependency builder proposal

File last commit:

r109:f71c50acc9f9 ioc ts support
r110:cc196cedcf24 ioc ts support
Show More
Annotations.ts
50 lines | 1.3 KiB | video/mp2t | TypeScriptLexer
/ src / main / ts / di / Annotations.ts
cin
Initial work on typescript support for the container configuration
r107 import { Constructor } from "../interfaces";
export interface InjectOptions {
lazy?: boolean;
}
cin
dependency builder proposal
r108 type Setter<T = any> = (v: T) => void;
type Injector<T> = {
[k in keyof T]: Setter;
};
cin
working on di decorators
r109 type Compatible<T1, T2> = T1 extends T2 ? any : never;
type SetterType<T> = T extends (v: infer V) => void ? V : never;
type Tuple<T = any> = Parameters<(...args: T[]) => void>;
interface Newable<A extends Tuple, T> {
new (...params: A): T;
prototype: T;
}
type MapTuple<T, A extends (keyof T)[]> = { [K in keyof A] : K extends number ? T[ A[K] ] : A[K] };
cin
dependency builder proposal
r108 export class Builder<T, S> {
cin
working on di decorators
r109 provides() {
cin
dependency builder proposal
r108 return <C extends Constructor<T>>(constructor: C) => {
return constructor;
};
}
inject<K extends keyof S>(dependency: K) {
cin
working on di decorators
r109 // K = "bar"
// M = "setValue"
// S[K] = Bar
// T[M] = (value: string) => void
// P[m] = (value: V) => void
return <P, M extends keyof (T | P)>(target: P, memberName: M, descriptor: TypedPropertyDescriptor<Compatible<T[M], Setter<S[K]>>>) => {
cin
dependency builder proposal
r108
};
}
cin
working on di decorators
r109 dependencies<D extends (keyof S)[]>(...deps: D) {
return <C extends Constructor<T>>(constructor: MapTuple<S, D> extends ConstructorParameters<C> ? C : never) => {
return constructor;
} ;
}
cin
dependency builder proposal
r108
}