2013-08-30 35 views
2

我想在打字稿來實現這一點:T型不滿足類型參數P錯誤的約束下,在打字稿

 
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 < TViewModel extends IViewModel >'不滿足約束'IScope < TViewModel extends IViewModel >'for type parameter'TScope extends IScope <TViewModel>'。「

如果我更進一步,儘量延長控制器類:

 
interface IMainViewModel extends IViewModel { } 

class MainController 
    extends Controller<IMainViewModel, IScope<IMainViewModel>> { } // {3} 

我得到的線類似的錯誤{3}:「類型‘的iScope <IMainViewModel>’不滿足約束「的iScope < TViewModel擴展了IViewModel >'用於類型參數'TScope extends IScope <TViewModel>'。「

在我看來,這應該工作。我究竟做錯了什麼?

我對TypeScript非常新穎,主要是用C#編寫代碼,如果我用C#編寫代碼 - 只需將TypeScript語法重寫爲C#等效,它就可以工作。

最奇怪的是,如果我刪除第{1}行,那麼這兩個錯誤都會消失。

回答

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> {   
} 
相關問題