[英]Can not return custom object in ES6 class's constructor in 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.