Annotations.ts
50 lines
| 1.3 KiB
| video/mp2t
|
TypeScriptLexer
|
|
r107 | import { Constructor } from "../interfaces"; | ||
| export interface InjectOptions { | ||||
| lazy?: boolean; | ||||
| } | ||||
|
|
r108 | type Setter<T = any> = (v: T) => void; | ||
| type Injector<T> = { | ||||
| [k in keyof T]: Setter; | ||||
| }; | ||||
|
|
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] }; | ||||
|
|
r108 | export class Builder<T, S> { | ||
|
|
r109 | provides() { | ||
|
|
r108 | return <C extends Constructor<T>>(constructor: C) => { | ||
| return constructor; | ||||
| }; | ||||
| } | ||||
| inject<K extends keyof S>(dependency: K) { | ||||
|
|
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]>>>) => { | ||||
|
|
r108 | |||
| }; | ||||
| } | ||||
|
|
r109 | dependencies<D extends (keyof S)[]>(...deps: D) { | ||
| return <C extends Constructor<T>>(constructor: MapTuple<S, D> extends ConstructorParameters<C> ? C : never) => { | ||||
| return constructor; | ||||
| } ; | ||||
| } | ||||
|
|
r108 | |||
| } | ||||
