簡體   English   中英

在 TypeScript 中動態返回類構造函數

[英]Dynamically return a class constructor in TypeScript

我正在嘗試在 TypeScript 中構建一種機制,以根據表示類名稱的字符串參數返回類的新實例。 基本上,我正在嘗試創建一個工廠,只是我不太清楚如何在 TypeScript 中執行此操作。 在純 JS 中,我可以通過將所有類構造函數存儲在一個鍵/值對象中並調用new ClassDictionary[className](); - 這不是最強大的解決方案,但它適用於這種情況。 我似乎無法在 TypeScript 中獲得正確的類型和轉換組合來實現這一點。 有沒有更好的辦法? 我在 TypeScript 中找不到任何工廠模式的例子,所以現在我只有一個 switch 語句,它既丑陋又不靈活。

您可以為字典中的每個類添加函數聲明,如下所示(訪問: https : //www.typescriptlang.org/docs/handbook/declaration-merging.html ):

class MyClass { 
    myMethod() { return "my return"; }
}

function factory(className: "Date"): Date;
function factory(className: "Number"): Number;
function factory(className: "MyClass"): MyClass;
function factory(className: string) { 

    var ClassDictionary = {
        "Date": Date,
        "Number": Number,
        "MyClass": MyClass
    };

    return new ClassDictionary[className]();
}

var d = factory("Date");

/* Its a date. */
alert(d.toISOString());

var n = factory("Number");

/* Now a number. */
alert(n.toPrecision());

var c = factory("MyClass");

/* And now MyClass. */
alert(c.myMethod());

在操場上工作( 示例

或者以其他方式

// ...
var ClassDictionary = { };

ClassDictionary["Date"] = Date;
function factory(className: "Date"): Date;

ClassDictionary["Number"] = Number;
function factory(className: "Number"): Number;

ClassDictionary["MyClass"] = MyClass;
function factory(className: "MyClass"): MyClass;

function factory(className: string) { 
    return new ClassDictionary[className]();
}
// ...

或使用參數:

class MyClass {
    constructor(public myReturn: string) { }
    myMethod() { return this.myReturn; }
}

var ClassDictionary = { };

ClassDictionary["Date"] = Date;
function factory(className: "Date"): Date;

ClassDictionary["Number"] = Number;
function factory(className: "Number", value?: number): Number;

ClassDictionary["MyClass"] = MyClass;
function factory(className: "MyClass", myReturn: string): MyClass;

function factory(className: string, valueOrMyReturn?: number | string) { 
   if(valueOrMyReturn) return new ClassDictionary[className](valueOrMyReturn);
    return new ClassDictionary[className]();
}

var d = factory("Date");

/* Its a date. */
alert(d.toISOString());

var n = factory("Number", 42);

/* Now a number. */
alert(n.toPrecision());

var c = factory("MyClass", "This is the answer!");

/* And now MyClass. */
alert(c.myMethod());

假設您有一個類定義:

module UI
{
    export class MyClass
    {
        constructor( data: any )
        {}
     }
}

您可以使用這種結構:

public static CreateController(  data: IControllerData ): any
    {
        return new data.namespace[data.controller]( data.initializationData );
    }

其中 data 是 JS 對象,是這樣的:

var data = {
            namespace: UI,
            controller: "MyClass"// <- this is the class name
            initializationData: {} // this is the parameters that you want to pass in constructor
}

創建 MyClass 類的新實例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM