import { Constructor } from "../interfaces"; import { primitive } from "../safe"; export interface InjectOptions { lazy?: boolean; } interface Dependency { $dependency: K; lazy?: boolean; } interface Lazy extends Dependency { lazy: true; } type Compatible = T1 extends T2 ? any : never; type ExtractService = K extends keyof S ? S[K] : K; type ExtractDependency = D extends { $dependency: infer K } ? D extends { lazy: true } ? () => ExtractService : ExtractService : WalkDependencies; type WalkDependencies = D extends primitive ? D : { [K in keyof D]: ExtractDependency }; interface Services { get(name: K): Dependency; lazy(name: K): Lazy; build(): Builder; } export declare function services(): Services; export declare function build(): Builder; export class Builder { consume

(...args: P) { return ) => T>(constructor: C) => { }; } inject

(...args: P) { // K = "bar" // M = "setValue" // S[K] = Bar // T[M] = (value: string) => void // P[m] = (value: V) => void return any }, M extends keyof (T | X)>( target: X, memberName: M, descriptor: TypedPropertyDescriptor) => any, T[M]>> ) => { }; } cast(): Builder { return this as Builder; } get(name: K): Dependency { throw new Error(); } lazy(name: K): Lazy { throw new Error(); } }