TypeScript を使用しているので、ロードされたオブジェクトを型付けする必要があると想定しています。これがサンプルクラスです (たとえば、多くの実装の 1 つをロードすることを選択しているため、インターフェイスも含まれています)。
interface IExample {
test() : string;
}
class Example {
constructor (private a: string, private b: string) {
}
test() {
return this.a + ' ' + this.b;
}
}
したがって、ある種のローダーを使用して実装を返すことになります。
class InstanceLoader {
constructor(private context: Object) {
}
getInstance(name: string, ...args: any[]) {
var instance = Object.create(this.context[name].prototype);
instance.constructor.apply(instance, args);
return instance;
}
}
そして、次のようにロードします。
var loader = new InstanceLoader(window);
var example = <IExample> loader.getInstance('Example', 'A', 'B');
alert(example.test());
現時点では、キャストがあります: <IExample>
- しかし、ジェネリックが追加されると、これを廃止して代わりにジェネリックを使用できます。これは次のようになります (まだ言語の一部ではないことに注意してください!)
class InstanceLoader<T> {
constructor(private context: Object) {
}
getInstance(name: string, ...args: any[]) : T {
var instance = Object.create(this.context[name].prototype);
instance.constructor.apply(instance, args);
return <T> instance;
}
}
var loader = new InstanceLoader<IExample>(window);
var example = loader.getInstance('Example', 'A', 'B');