3

我正在尝试在 TypeScript 中实现这一点:

接口 IViewModel { }
接口 IScope<TViewModel 扩展 IViewModel> {
    虚拟机:TViewModel;// {1}
}
接口 IController<TViewModel 扩展 IViewModel,TScope 扩展 IScope<TViewModel>> { }

类 Controller<TViewModel 扩展 IViewModel,TScope 扩展 IScope<TViewModel>>
    实现 IController<TViewModel, TScope> { } // {2}

但我在第 {2} 行遇到错误:“类型‘IScope<TViewModel extends IViewModel>’不满足类型参数‘TScope extends IScope<TViewModel>’的约束‘IScope<TViewModel extends IViewModel>’。”

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

接口 IMainViewModel 扩展 IViewModel { }

类主控制器
    扩展 Controller<IMainViewModel, IScope<IMainViewModel>> { } // {3}

我在第 {3} 行收到类似错误:“类型 'IScope<IMainViewModel>' 不满足类型参数 'TScope extends IScope<TViewModel>' 的约束 'IScope<TViewModel extends IViewModel>'。”

在我看来,这应该可行。我究竟做错了什么?

我对 TypeScript 很陌生,我主要用 C# 编写代码,如果我用 C# 编写此代码 - 只需将 TypeScript 语法重写为其 C# 等效项,它就可以正常工作。

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

4

1 回答 1

3

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 
} 

看起来像是打字稿编译器错误(您可能想在此处报告)。需要明确的是,以下确实有效:

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

interface IController<TViewModel, TScope extends IScope> { }
class Controller<TViewModel, TScope extends IScope>
    implements IController<TViewModel, TScope> {        
} 
于 2013-08-30T08:20:15.540 回答