描述在ClassScript中将类作为参数的函数参数

时间:2016-11-13 03:12:46

标签: oop typescript instance

我想编写一个解析类类型(类,而不是实例)的函数,然后函数将基于该参数实例化一个实例。

最好通过示例解释:

//All possible paramter types must inherit from this base class
class Base { public name : string = ''; }

//These are possible classes that could be parsed to the function
class Foo extends Base { constructor() { super(); console.log("Foo instance created"); } }
class Bar extends Base { constructor() { super(); console.log("Bar instance created"); } }

//This function should take a class that inherits from 'Base' as a paramter - then it will create an instance
function Example(param : ?????????) : Base //I don't know what type the 'param' should be
{
    return new param(); //Create instance?? How do I do this
}

//This should be the output - if it worked (but it doesn't)
Example(Foo); //Logs "Foo instance created""
Example(Bar); //Logs "Foo instance created""

//So if this worked, it would become possible to do this:
let b : Foo = Example(Foo);
let c : Bar = Example(Bar);

所以我的问题是:'示例'函数的参数是什么类型的?我如何在函数中创建一个param实例。

注意,如果这个问题是重复的,我道歉 - 但我不知道这个过程的技术名称,所以很难研究。

1 个答案:

答案 0 :(得分:3)

你想要这样的东西。

function Example<T extends Base>(param: new () => T): T {
    return new param();
}

我们知道您将拥有某种类型Base。我们将其命名为T,我们会说T extends Base来强制执行此操作。

我们也知道param将构建一个没有参数的T。我们可以写new () => T来描述它。

基本上考虑这个问题的方法是,类具有实例侧和静态侧(也称为“构造函数”侧)。在您的示例中,BaseFooBar都有静态的一面。

每个静态端由您指定的所有静态成员(在这种情况下没有任何静态成员)以及构造签名组成。在您的情况下,Example采用构造函数不需要参数,并生成一些Base的子类型。