Annotations.ts
75 lines
| 1.9 KiB
| video/mp2t
|
TypeScriptLexer
|
|
r107 | import { Constructor } from "../interfaces"; | ||
|
|
r118 | import { primitive } from "../safe"; | ||
|
|
r107 | |||
| export interface InjectOptions { | ||||
| lazy?: boolean; | ||||
| } | ||||
|
|
r114 | interface Dependency<K extends keyof any> { | ||
| $dependency: K; | ||||
| lazy?: boolean; | ||||
| } | ||||
| interface Lazy<K extends keyof any> extends Dependency<K> { | ||||
| lazy: true; | ||||
| } | ||||
|
|
r109 | type Compatible<T1, T2> = T1 extends T2 ? any : never; | ||
|
|
r111 | type ExtractService<K, S> = K extends keyof S ? S[K] : K; | ||
|
|
r109 | |||
|
|
r118 | type ExtractDependency<D, S> = D extends { $dependency: infer K } ? | ||
| D extends { lazy: true } ? () => ExtractService<K, S> : ExtractService<K, S> : | ||||
| WalkDependencies<D, S>; | ||||
|
|
r109 | |||
|
|
r118 | type WalkDependencies<D, S> = D extends primitive ? D : | ||
| { [K in keyof D]: ExtractDependency<D[K], S> }; | ||||
|
|
r109 | |||
|
|
r118 | interface Services<S> { | ||
| get<K extends keyof S>(name: K): Dependency<K>; | ||||
|
|
r114 | |||
| lazy<K extends keyof S>(name: K): Lazy<K>; | ||||
|
|
r118 | build<T extends object>(): Builder<T, S>; | ||
|
|
r114 | } | ||
|
|
r118 | export declare function services<S extends object>(): Services<S>; | ||
| export declare function build<T = never, S = any>(): Builder<T, S>; | ||||
|
|
r114 | |||
|
|
r108 | export class Builder<T, S> { | ||
|
|
r111 | consume<P extends any[]>(...args: P) { | ||
| return <C extends new (...args: ExtractDependency<P, S>) => T>(constructor: C) => { | ||||
|
|
r108 | }; | ||
| } | ||||
|
|
r118 | inject<P extends any[]>(...args: P) { | ||
|
|
r109 | // K = "bar" | ||
| // M = "setValue" | ||||
| // S[K] = Bar | ||||
| // T[M] = (value: string) => void | ||||
| // P[m] = (value: V) => void | ||||
|
|
r118 | return <X extends { [m in M]: (...args: any) => any }, M extends keyof (T | X)>( | ||
| target: X, | ||||
| memberName: M, | ||||
| descriptor: TypedPropertyDescriptor<Compatible<(...args: ExtractDependency<P, S>) => any, T[M]>> | ||||
| ) => { | ||||
|
|
r108 | |||
| }; | ||||
| } | ||||
|
|
r112 | cast<T2 extends T>(): Builder<T2, S> { | ||
| return this as Builder<T2, S>; | ||||
| } | ||||
|
|
r118 | get<K extends keyof S>(name: K): Dependency<K> { | ||
| throw new Error(); | ||||
| } | ||||
| lazy<K extends keyof S>(name: K): Lazy<K> { | ||||
| throw new Error(); | ||||
| } | ||||
|
|
r108 | } | ||
