我正在尝试在TypeScript中实现它:
interface IViewModel { } interface IScope<TViewModel extends IViewModel> { vm: TViewModel; // {1} } interface IController<TViewModel extends IViewModel, TScope extends IScope<TViewModel>> { } class Controller<TViewModel extends IViewModel, TScope extends IScope<TViewModel>> implements IController<TViewModel, TScope> { } // {2}
但我在第{2}行收到错误:“输入'IScope&lt; TViewModel扩展IViewModel&gt;'不满足约束'IScope&lt; TViewModel extends IViewModel&gt;'对于类型参数'TScope extends IScope&lt; TViewModel&gt;'。“
如果我更进一步尝试扩展Controller类:
interface IMainViewModel extends IViewModel { } class MainController extends Controller<IMainViewModel, IScope<IMainViewModel>> { } // {3}
我在第{3}行收到类似错误:“输入'IScope&lt; IMainViewModel&gt;'不满足约束'IScope&lt; TViewModel extends IViewModel&gt;'对于类型参数'TScope extends IScope&lt; TViewModel&gt;'。“
我觉得这应该有效。我做错了什么?
我是TypeScript的新手,我主要用C#编写代码,如果我用C#编写这段代码 - 只需将TypeScript语法重写为C#等价物,就可以了。
最奇怪的是,如果我删除行{1},则两个错误都会消失。
答案 0 :(得分:2)
Typescript接口是结构性的。这就解释了为什么当你从{1}
中删除唯一的项目时,你不会再出现任何错误,因为任何东西都会与空接口兼容。
那说以下也应该有效:
interface IScope<TViewModel> {
vm: TViewModel; // {1}
}
interface IController<TViewModel, TScope extends IScope<TViewModel>> { }
class Controller<TViewModel, TScope extends IScope<TViewModel>>
implements IController<TViewModel, TScope> { // Gets an error
}
看起来像打字稿编译器错误(you might want to report it here)。要明确以下内容确实有效:
interface IScope {
vm: number; // {1}
}
interface IController<TViewModel, TScope extends IScope> { }
class Controller<TViewModel, TScope extends IScope>
implements IController<TViewModel, TScope> {
}