我已经打了一下,有接口,以构建签名的打字稿,和我有点困惑时,以下没有类型检查:接口,以构建签名不是类型检查
class Foo {
constructor() {
}
}
interface Bar {
new(): Bar;
}
function Baz(C : Bar) {
return new C()
}
var o = Baz(Foo);
类型错误:
提供的参数不匹配,通话对象的任何签名: 构造类型的“新的()=>富”和“酒吧”是 不兼容的签名:类型“酒吧”需要一个结构特征,但类型 '富'缺乏(C:Bar)=> Bar
Foo构造函数的类型是()=> Foo,这就是我认为的Bar说的。我在这里错过了什么吗?
而不是使用'any'你使用超级接口(你可以省略'implements'和'extends',btw)。没错,我猜,并且比'any'更好,但有一件事仍然让我感到困惑:为什么你不能让'NewableBar :: new()'返回一个'NewableBar'?为什么它必须是一个比'NewableBar'更通用的类型(显然至少与'Foo'一样)? –
@AdrianLang我把明确的继承和实现放在明确的位置,但你是正确的 - 如果一切都匹配,TypeScript会很乐意推断这些。尝试将方法上的new()签名视为特定类型时存在解释问题。 – Fenton
但是,只要您尝试向Foo添加任何内容,就会中断。 编辑:对不起,我做错了。我的结构签名应该是:'new(... _:any []):Bar;' – farre