类型T不满足TypeScript中类型参数P error的约束C.

时间:2013-08-30 00:38:22

标签: generics typescript

我正在尝试在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},则两个错误都会消失。

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> {        
}