【发布时间】:2014-11-21 06:35:25
【问题描述】:
我有一些看起来像这样的通用代码:
interface IClass<T> {
new (...args: any[]): T;
}
function someFactory<T>(a: IClass<T>): T {
return new a();
}
class Foo { }
var f = someFactory(Foo);
并且f 被正确推断为Foo。该函数还禁止非新类型。
此外,编译器允许以下情况,f 的类型为any:
function Foo() { }
var f = new Foo();
所以我希望以下通用代码可以工作:
interface IInstance<T> {
constructor: IClass<T>;
}
function extractType<T>(a: IInstance<T>): IClass<T> {
return a.constructor;
}
class Foo { }
var f = new Foo();
var t = extractType(f);
但我在提取类型的 f 参数上收到此错误:
“Foo”类型的参数不能分配给“IInstance”类型的参数。
如果我放松打字:
function extractType<T extends Object>(a: T): IClass<T> {
return a.constructor;
}
class Foo { }
var f = new Foo();
var t = extractType(f);
我在a.constructor 收到此错误:
类型“Function”不可分配给类型“IClass”。
由于一个函数是新的,我希望这些模式可以工作。如果我使用 new() 签名扩展 Function 接口,它们都可以工作:
interface Function {
new (...args: any[]): any;
}
那么,Function 是否缺少new() 签名,还是有其他方式来表达我的意图?
【问题讨论】:
标签: typescript