gpt4 book ai didi

javascript - 在 TypeScript 中动态返回一个类构造函数

转载 作者:数据小太阳 更新时间:2023-10-29 06:11:04 24 4
gpt4 key购买 nike

我正在尝试在 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());

Playground 上的作品 ( Sample )

或者换一种方式

// ...
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());

关于javascript - 在 TypeScript 中动态返回一个类构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31076535/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com