2015-11-20 11 views
6

要約すると、いくつかの基本プロパティを宣言するインターフェイスを持つことは可能ですが、追加のプロパティは制限しませんか?これは私の現在の状況です:他のプロパティを許可するTypeScriptインターフェイス

私は一般的なディスパッチャを定義する、Flux patternを使用しています:

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

私は、このように、私自身のペイロードタイプでディスパッチャを作成します。

interface ActionPayload { 
    actionType: string 
} 

const dispatcher = new Dispatcher<ActionPayload>(); 

私はいくつかの追加データでペイロードをディスパッチすべきいくつかのアクションコードを持っていますが、ActionPayloadインターフェイスはactionTypeしか許されません。換言すれば、このコード:someOtherDataActionPayloadインターフェイスと一致しないため

interface SomePayload extends ActionPayload { 
    someOtherData: any 
} 

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

は、コンパイルエラーが発生します。問題は、多くの異なる「アクション」クラスが同じディスパッチャを再利用することです。したがって、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

関連する問題