2015-11-20 16 views
6

In sintesi, è possibile avere un'interfaccia che dichiari alcune proprietà di base, ma non limiti le proprietà aggiuntive? Questa è la mia situazione attuale:Interfaccia TypeScript che consente altre proprietà

Sto utilizzando il Flux pattern, che definisce un dispatcher generico:

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

Ho quindi creare un dispatcher con il mio tipo di payload, come questo:

interface ActionPayload { 
    actionType: string 
} 

const dispatcher = new Dispatcher<ActionPayload>(); 

Ora ho un codice di azione che dovrebbe inviare un carico utile con alcuni dati aggiuntivi, ma l'interfaccia ActionPayload consente solo actionType. In altre parole, questo codice:

interface SomePayload extends ActionPayload { 
    someOtherData: any 
} 

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

Dà una compilazione errore perché someOtherData non corrisponde l'interfaccia ActionPayload. Il problema è che molte diverse classi di "azione" riutilizzeranno lo stesso dispatcher, quindi mentre è qui potrebbe essere anotherKindOfData laggiù, e così via. Al momento, tutto ciò che posso fare per accontentarlo è utilizzare new Dispatcher<any>() perché verranno inviate diverse azioni. Tutte le azioni condividono una base ActionPayload, quindi speravo di riuscire a limitare il tipo come new Dispatcher<extends ActionPayload>() o qualcosa del genere. È possibile qualcosa del genere?

risposta

1

Penso di aver trovato quello che stavo cercando. Posso cast dell'oggetto inviato a SomePayload, e TSC convalida che il suo compatibile sia con l'interfaccia cast e la TPayload del dispatcher:

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

Example online.

17

Se si desidera ActionPayload di accettare qualsiasi altra proprietà è possibile aggiungere un indicizzatore:

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

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

+0

Grazie, questo è buono informazioni. Risponde esattamente al mio titolo troppo semplificato ... si scopre che c'era un modo per usare l'estensione '' nei dettagli della mia domanda semplicemente lanciando il letterale dell'oggetto. Ci scusiamo per la domanda maldestra. Dovrei provare a correggere il titolo e il sommario, ad esempio "Come implementare una sottointerfaccia e soddisfare una super-interfaccia con un oggetto letterale", o semplicemente accettare la risposta? – Aaron

+0

Uno o l'altro va bene con me. Cambiare il titolo è probabilmente meglio per riflettere le domande. – Sebastien

Problemi correlati