我目前有一个需要接受一个类类型,实例化该类并返回模板类型的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
答案 0 :(得分:1)
typeof
运算符通常不会获得类的构造函数;它获取具有特定名称的 value 的类型。您所感到的困惑是,用class Foo {}
声明的类创建了名为Foo
的类型(该类的实例类型)和名为Foo
的 value (该类的构造函数),然后typeof Foo
是该值的类型。但是使用通用类型参数ActorType
,就没有名为ActorType
的值,您可以使用typeof ActorType
来获得类型...即使有这样的值,也几乎没有最终可能是ActorType
实例的构造函数。类型和值之间的区别非常重要且令人困惑,我之前对此talked at length进行过介绍。
您真正要寻找的是"new
able" call signature。如果您的实例类型为T
,则没有参数的构造函数将生成T
的实例,类型为:
new() => T;
或等效地:
{ new(): T }
如果您使用new() => ActorType
而不是typeof ActorType
,则应该可以完成这项工作。希望能有所帮助;祝你好运!