typescript - ClassName : string'e Göre Sınıfın Örneğini Oluşturma


Biri bunu tekrar olarak işaretlemeden önce lütfen aşağıyı okuyun,

Senaryom sadece TypeScript'i değil, aynı zamanda Angular2'yi de içeriyor.

Amaç

app.component.ts içinde bir yöntem gerekiyor, bu yöntem bir string (Sınıf Adı) alır ve bunun bir örneğini oluşturur. Sınıflar diğer ts dosyalarında mevcut.

Şimdi kullanım durumuna geçelim: getWidgetObjectFromClassName(className : string) : Object{} adında bir metodum var ve bu metod, string formatında olan sınıf adının örneklerini döndürmek zorunda. Şimdi problem şu ki,

NameSpace kullanmayı denedim ve let instance=new SampleNS['OtherName'](); yaptım (SampleNS bir isim alanıdır), tek dosya durumunda tamamen sorunsuz çalışıyor.

Ama Şimdi birden fazla ts dosyam var, diyelim ki interfaces.ts, classes.ts, otherclasses.ts. interface.ts'te export namespace SampleNS{} kullanıyorum, her şey çalışıyor, sonraki classes.ts'te /// <reference path="interfaces.ts" /> ve aynı namespace olan SampleNS kullanılıyor.

Şimdi benim yöntemim getWidgetObjectFromClassName(className : string) : Object{} xyz.ts dosyasında ve şimdi hangi import'u vermeliyim?, demek istediğim, eğer `import {SampleNS} from './interfaces'` dersem. Buradaki sorun, sadece tek bir dosyanın isim alanını(import) getirebiliyorum (aynı olsa bile) bu yüzden oluşturduğum örnek belirli dosya isim alanının import'u ile sınırlı oluyor.

Plunker Bağlantısı https://plnkr.co/edit/pt90F34KPsGoHDpSUQFD?p=preview

Cevap #1

İçe aktarmalarla birlikte as kullanın

import * as widgets from './lib';
...
this.widgetInstance = new widgets[className](); 

Plunker örneği

Bunu başka bir cevaptan hatırlıyorum ama biraz kredi vermek için bulamadım :-/

Cevap #2

Bir sınıf adından nesne oluşturmak için eval kullanabilirsiniz:

class SomeClass
{
    x: number;
    y: number;
    constructor() {
        this.x = this.y = 1;
    }

}



function getWidgetObjectFromClassName(className : string) : {}
{
    return eval("new " + className + "();");
}

console.log("%o", getWidgetObjectFromClassName("SomeClass"));

Oyun alanı burada

İlgili makaleler