Created
January 6, 2018 16:16
-
-
Save mfdeveloper/c337408608d6033fde967fc2e76b12c4 to your computer and use it in GitHub Desktop.
Creating TypeScript Classes Dynamically - Totally based on Steve Fenton solution
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* Creates a dynamic instance of a specific class/prototype. | |
* Minor changes from initial solution shared by **Steve Fenton** | |
* | |
* WARNING: This solution don't works on Angular applications, | |
* using JIT (because the webpack don't compiles classes into window object) | |
* or AOT (js minification for production build) compilation. | |
* | |
* @see https://www.stevefenton.co.uk/2014/07/creating-typescript-classes-dynamically/ | |
*/ | |
export class InstanceLoader { | |
static getInstance<T>(context: { [key: string]: any }, name: string, ...args: any[]): T { | |
const classRef: { new (...args: any[]): any; } = context[name]; | |
if (!classRef) { | |
throw new Error(`The class '${name}' was not found`); | |
} | |
let instance = Object.create(classRef.prototype); | |
try { | |
instance.constructor.apply(instance, args); | |
} catch (err) { | |
/** | |
* For ES2015(ES6): constructor.apply is not allowed | |
*/ | |
if (/Class constructor/.test(err.toString())) { | |
instance = class extends classRef { | |
constructor(...params: any[]) { | |
super(...params); | |
} | |
}; | |
return <T>new instance(args); | |
} | |
} | |
return <T>instance; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment