Guest User

Untitled

a guest
Feb 22nd, 2021
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import 'reflect-metadata'
  2.  
  3. export interface Constructor<T> {
  4.     new(...args: any[]): T
  5. }
  6.  
  7. type ClassDecorator<T extends Function> = (Target: Constructor<T>) => T | void
  8.  
  9. export const Injectable = (): ClassDecorator<any> => {
  10.     return target => {}
  11. }
  12.  
  13. export const Injector = new class {
  14.     resolve<T>(Target: Constructor<T>) : T {
  15.         const requiredParams = Reflect.getMetadata('design:paramtypes', Target) || []
  16.         const resolvedParams = requiredParams.map((param: any) => Injector.resolve(param))
  17.         const instance = new Target(...resolvedParams)
  18.         return instance
  19.     }
  20. }()
  21.  
  22. /////////////////
  23.  
  24. @Injectable()
  25. class NoDeps {
  26.     doSth() {
  27.         console.log(`I'm NoDeps!`);
  28.    }
  29. }
  30.  
  31. @Injectable()
  32. class OneDep {
  33.    constructor(public noDeps: NoDeps) {}
  34.    doSth() {
  35.        console.log(`I'm OneDep!`);
  36.     }
  37. }
  38.  
  39. @Injectable()
  40. class MoarDeps {
  41.     constructor(public noDeps: NoDeps, public oneDep: OneDep) {}
  42.     doSth() {
  43.         console.log(`I'm MoarDeps!`);
  44.    }
  45. }
  46.  
  47. const moarDeps = Injector.resolve(MoarDeps)
  48. moarDeps.noDeps.doSth();
  49. moarDeps.oneDep.doSth();
  50. moarDeps.oneDep.noDeps.doSth();
Advertisement
Add Comment
Please, Sign In to add comment