import { Constructor } from "../interfaces"; export interface InjectOptions { lazy?: boolean; } type Setter = (v: T) => void; type Compatible = T1 extends T2 ? any : never; type SetterType = T extends (v: infer V) => void ? V : never; type ExtractService = K extends keyof S ? S[K] : K; type ExtractDependency = D extends { $dependency: infer K } ? D extends { lazy: true } ? () => ExtractService : ExtractService : VisitDependency; type VisitDependency = D extends {} ? { [K in keyof D]: ExtractDependency } : D; export class Builder { consume

(...args: P) { return ) => T>(constructor: C) => { return constructor as typeof constructor & { service: () => T }; }; } 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>>) => { }; } cast(): Builder { return this as Builder; } }