使用捕获的类型来定义新实例

时间:2017-10-24 05:34:01

标签: typescript

class NewInstanceOfClass {
    public static Make<N>(instance:N):void {
        return (new N()); //Cannot find name 'N'.
    }
}

这可能是一个非常简单的示例,但我希望能够使用捕获的类型数据来创建实例所属的确切类的新实例。这可能在TS?

2 个答案:

答案 0 :(得分:2)

Typescript使用类型擦除来实现泛型,因此new N()将无法工作,因为N在运行时是未知的。鉴于您的代码,您有两种选择:

您可以传入构造函数:

public static Make<N>(classCtor:new ()=> N) : N {
    return new classCtor(); 
}
Make(SomeClass)

为什么我们需要函数类型前面的new:虽然构造函数是一个函数,但它是一个可以构建对象的特殊函数,可以使用new运算符调用。规范定义了constructor literal types

等功能

或者,如果您使用constructor内置属性

的类型实例,则可以获取该类的构造函数
public static Make2<N>(instance: N) : N {
    let classCtor: new ()=> N = instance.constructor as any;
    return new classCtor(); 
}
Make2(new SomeClass())

答案 1 :(得分:1)

  

return(new N()); //找不到名字'N'。

您需要返回instance,因为N不在变量声明空间

修复:一般想法

class NewInstanceOfClass {
    public static Make<N>(instance:N):void {
        return (new instance()); 
    }
}

更多

宣言空间https://basarat.gitbooks.io/typescript/docs/project/declarationspaces.html