Generics 类型T不满足类型脚本中类型参数P错误的约束C

Generics 类型T不满足类型脚本中类型参数P错误的约束C,generics,typescript,Generics,Typescript,我试图在TypeScript中实现这一点: interface IViewModel { } interface IScope<TViewModel extends IViewModel> { vm: TViewModel; // {1} } interface IController<TViewModel extends IViewModel, TScope extends IScope<TViewModel>> { } class Control

我试图在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} 接口IViewModel{} 接口范围{ vm:TViewModel;//{1} } 接口IController{} 类控制器 实现IController{}/{2} 但是我在第{2}行得到一个错误:“类型'IScope'不满足类型参数'TScope extensed IScope'的约束'IScope'

如果我进一步尝试扩展Controller类:

interface IMainViewModel extends IViewModel { } class MainController extends Controller<IMainViewModel, IScope<IMainViewModel>> { } // {3} 接口IMainViewModel扩展IViewModel{} 类主控制器 扩展控制器{}/{3} 我在第{3}行得到了一个类似的错误:“类型'IScope'不满足类型参数'TScope extensed IScope'的约束'IScope'

在我看来,这应该行得通。我做错了什么

我对TypeScript非常陌生,我主要用C#编写代码,如果我用C#编写这段代码——只需将TypeScript语法重写为它的C#等价物,它就工作得很好


最奇怪的是,如果我删除第{1}行,两个错误都会消失。

类型脚本接口是结构化的。这就解释了为什么当您从
{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 
} 
interface-IScope{
vm:TViewModel;//{1}
}
接口IController{}
类控制器
实现IController{//获取一个错误
} 
看起来像是typescript编译器错误()。需要明确的是,以下各项确实有效:

interface IScope {
    vm: number; // {1}
}

interface IController<TViewModel, TScope extends IScope> { }
class Controller<TViewModel, TScope extends IScope>
    implements IController<TViewModel, TScope> {        
} 
interface-IScope{
vm:number;//{1}
}
接口IController{}
类控制器
实现IController{
}