2015-11-20 114 views
6

總之,是否可以有一個聲明某些基本屬性但不限制其他屬性的接口?這是我目前的狀況:允許其他屬性的TypeScript接口

我使用的是Flux pattern,它定義了一個通用的調度員:

class Dispatcher<TPayload> { 
    dispatch(arg:TPayload):void { } 
} 

我然後創建一個調度員用自己的有效載荷類型,像這樣:

interface ActionPayload { 
    actionType: string 
} 

const dispatcher = new Dispatcher<ActionPayload>(); 

現在我有一些動作代碼應該用一些額外的數據調度有效載荷,但ActionPayload接口只允許actionType。換句話說,此代碼:

interface SomePayload extends ActionPayload { 
    someOtherData: any 
} 

class SomeActions { 
    doSomething():void { 
     dispatcher.dispatch({ 
      actionType: "hello", 
      someOtherData: {} 
     }) 
    } 
} 

給出一個編譯錯誤,因爲someOtherDataActionPayload接口不匹配。問題在於許多不同的「行動」類將重新使用同一個調度程序,所以在這裏它可能是someOtherData,可能是anotherKindOfData,依此類推。目前,我所能做的就是使用new Dispatcher<any>(),因爲不同的動作將被調度。儘管如此,所有操作都共享一個基地ActionPayload,所以我希望能夠約束new Dispatcher<extends ActionPayload>()之類的類型。有這樣的可能嗎?

回答

1

我想我找到了我正在尋找的東西。我可以派遣對象轉換爲SomePayload和TSC驗證其跟投界面和調度的TPayload同時兼容:

dispatcher.dispatch(<SomePayload>{ 
     actionType: "hello", 
     someOtherData: {} 
    }) 

Example online.

17

如果你想ActionPayload接受任何其他的屬性,你可以添加一個索引:

interface ActionPayload { 
    actionType: string, 
    [x: string]: any 
} 

https://github.com/Microsoft/TypeScript/wiki/Breaking-Changes#strict-object-literal-assignment-checking

+0

謝謝,這是好消息。它完全回答了我的過度簡化的標題......事實證明,通過簡單地轉換對象字面量,可以在我的問題的細節中使用擴展的''。對不起,這個笨拙的問題。我是否應該嘗試修復標題和摘要,例如「如何實現子接口並使用對象字面值滿足超級接口」,或者只是接受你的答案? – Aaron

+0

其中一個對我來說很好。改變標題可能更好地反映問題。 – Sebastien

相關問題