2016-05-18 1 views
1

Ich habe einige Probleme mit der Deklaration des Redux-Aktionstyps. Per Definition sollte die Redux Action type Eigenschaft haben und könnte einige andere Eigenschaften haben.Wie TypeScript-Objektschnittstelle deklariert wird, die genaue Felder und zusätzliche Eigenschaften hat

Nach Typoskript interfaces page in HandBook (siehe "Excess Property Checks") i es so tun könnte:

interface IReduxAction { 
    type: string; 
    [propName: string]: any; 
} 

Und so scheint es in einigen Situationen zu arbeiten (wie Deklaration einer Variablen)

const action: IReduxAction = { 
    type: 'hello', 
    value: 'world' 
}; 

Aber wenn ich versuche, Funktion zu deklarieren, die die Aktion verwendet:

function hello(state = {}, action: IReduxAction) { 
    return { type: action.type, text: action.text }; 
} 

Es schlägt fehl mit der Meldung "Die Eigenschaft text existiert nicht am Typ IReduxAction".

Was mache ich falsch? Wie deklariert man den allgemeinen Aktionstyp?

Live-Beispiel auf Typoskript Spielplatz ist here

P. S. Ich überprüfte "ähnliche" Fragen, wie Why am I getting an error "Object literal may only specify known properties"?, und habe die Lösung dort nicht gefunden ...

Antwort

1

In derselben Seite, auf die Sie verwiesen haben, spricht darüber im Abschnitt mit dem Titel Indexable Types.

Sie werden dies tun müssen:

function hello(state = {}, action: IReduxAction) { 
    return { type: action.type, text: action["text"] }; 
} 

als Schnittstelle Definition von String (Schlüssel) zu jedem (Wert) haben definiert Index.

+0

Ich lese diesen Abschnitt auch. Und mit deinen Änderungen funktioniert es gut. Das Problem ist - ich möchte hier nicht Punkt-Notation verwenden. Seine normale JavaScript-Notation und es sollte möglich sein, dass es irgendwie funktioniert ... Die Frage ist - wie? – ValeriiVasin

+0

Soweit ich weiß, können Sie nicht, so unterscheidet Typoskript zwischen bekannten Feldern und indexierbaren. –

Verwandte Themen