-
-
Save jiverson/ac16685dfd536a859ccc674376e2ca4e to your computer and use it in GitHub Desktop.
Creating TypeScript Classes Dynamically - Totally based on Steve Fenton solution
This file contains hidden or 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