Jak*_*dík 6 generics typescript
我正在尝试在 TypeScript 中实现这一点:
接口 IViewModel { }
接口 IScope<TViewModel 扩展 IViewModel> {
vm: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} 行,两个错误都会消失。
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
}
Run Code Online (Sandbox Code Playgroud)
看起来像打字稿编译器错误(您可能想在此处报告)。需要明确的是,以下内容确实有效:
interface IScope {
vm: number; // {1}
}
interface IController<TViewModel, TScope extends IScope> { }
class Controller<TViewModel, TScope extends IScope>
implements IController<TViewModel, TScope> {
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
19447 次 |
| 最近记录: |