打字稿模板类typeof

时间:2020-06-03 20:25:49

标签: typescript class templates

我目前有一个需要接受一个类类型,实例化该类并返回模板类型的INSTANCE的函数。我收到一个错误:'ActorType' only refers to a type, but is being used as a value here.

spawnActor<ActorType extends Actor>(actorClass: typeof ActorType): ActorType {
    let actorObject = new actorClass();
    actorObject.sayHello(); // specific to Actor
    return actorObject;
}

当前,我发现如果不使用模板actorClass: Actor而不是模板actorClass: ActorType来设置参数类型,则声明有效。但是,在调用函数时,我必须明确指定模板类型,因为无法从传递给actorClass参数的类中推断出模板类型。

spawnActor<ActorType extends Actor>(actorClass: typeof Actor): ActorType {
    let actorObject = (new actorClass() as ActorType); // must cast to template type
    actorObject.sayHello(); // specific to Actor
    return actorObject;
}

let a = spawnActor<MyActorClass>(MyActorClass); // have to give template type for a to have correct type
//let a = spawnActor(MyActorClass); // ideally it would be inferred

1 个答案:

答案 0 :(得分:1)

typeof运算符通常不会获得类的构造函数;它获取具有特定名称的 value 的类型。您所感到的困惑是,用class Foo {}声明的类创建了名为Foo的类型(该类的实例类型)和名为Foo value (该类的构造函数),然后typeof Foo是该值的类型。但是使用通用类型参数ActorType,就没有名为ActorType的值,您可以使用typeof ActorType来获得类型...即使有这样的值,也几乎没有最终可能是ActorType实例的构造函数。类型和值之间的区别非常重要且令人困惑,我之前对此talked at length进行过介绍。

您真正要寻找的是"newable" call signature。如果您的实例类型为T,则没有参数的构造函数将生成T的实例,类型为:

new() => T;

或等效地:

{ new(): T }

如果您使用new() => ActorType而不是typeof ActorType,则应该可以完成这项工作。希望能有所帮助;祝你好运!