import { Constructor } from "../interfaces"; export interface InjectOptions { lazy?: boolean; } type Setter = (v: T) => void; type Injector = { [k in keyof T]: Setter; }; type Compatible = T1 extends T2 ? any : never; type SetterType = T extends (v: infer V) => void ? V : never; type Tuple = Parameters<(...args: T[]) => void>; interface Newable { new (...params: A): T; prototype: T; } type MapTuple = { [K in keyof A] : K extends number ? T[ A[K] ] : A[K] }; export class Builder { provides() { return >(constructor: C) => { return constructor; }; } inject(dependency: K) { // K = "bar" // M = "setValue" // S[K] = Bar // T[M] = (value: string) => void // P[m] = (value: V) => void return (target: P, memberName: M, descriptor: TypedPropertyDescriptor>>) => { }; } dependencies(...deps: D) { return >(constructor: MapTuple extends ConstructorParameters ? C : never) => { return constructor; } ; } }