Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import 'reflect-metadata'
- export interface Constructor<T> {
- new(...args: any[]): T
- }
- type ClassDecorator<T extends Function> = (Target: Constructor<T>) => T | void
- export const Injectable = (): ClassDecorator<any> => {
- return target => {}
- }
- export const Injector = new class {
- resolve<T>(Target: Constructor<T>) : T {
- const requiredParams = Reflect.getMetadata('design:paramtypes', Target) || []
- const resolvedParams = requiredParams.map((param: any) => Injector.resolve(param))
- const instance = new Target(...resolvedParams)
- return instance
- }
- }()
- /////////////////
- @Injectable()
- class NoDeps {
- doSth() {
- console.log(`I'm NoDeps!`);
- }
- }
- @Injectable()
- class OneDep {
- constructor(public noDeps: NoDeps) {}
- doSth() {
- console.log(`I'm OneDep!`);
- }
- }
- @Injectable()
- class MoarDeps {
- constructor(public noDeps: NoDeps, public oneDep: OneDep) {}
- doSth() {
- console.log(`I'm MoarDeps!`);
- }
- }
- const moarDeps = Injector.resolve(MoarDeps)
- moarDeps.noDeps.doSth();
- moarDeps.oneDep.doSth();
- moarDeps.oneDep.noDeps.doSth();
Advertisement
Add Comment
Please, Sign In to add comment