2017-04-14 2 views
6
export type Size = 
| 'small' 
| 'medium' 
| 'large' 
| 'big' 
| 'huge'; 

definieren Size Typ wie das gibt mir die automatische Vervollständigung in meinem IDE, wo ich es verwenden:Umgang mit Aufzählungen mit FlowType

enter image description here

Doch ich möchte auch innerhalb Verwendung dieser Werte machen einer Komponente: Sagen wir ein Dropdown-Menü mit verfügbaren Größenwerten.

Um zu erreichen, dass ich die Aufrechterhaltung einer Größen Objekt aus denen kann ich die Größe FlowType extrahieren durch die Nutzung $ Keys:

Es Art arbeitet der, dass es Punkte out ungültige Werte für eine Stütze: enter image description here

Doch kommt diese Lösung zu einem Preis: es Schrauben alle meine auto-Vervollständigung goodne ss ... :(Gibt es eine bessere Möglichkeit, Enums in FlowType zu behandeln?

enter image description here

Antwort

1

Das ist eine saubere Nutzung von $Keys ist!

Ich kenne keinen besseren Weg, um den Size Typ von einem Objekt abzuleiten. Vielleicht könnten Sie in der anderen Richtung, wie diese Arbeit:

export type Size = 
| 'small' 
| 'medium' 
| 'large' 
| 'big' 
| 'huge'; 

export const sizes: { [key: string]: Size } = { 
    small: 'small', 
    medium: 'medium', 
    large: 'large', 
    big: 'big', 
    huge: 'huge', 
}; 

oder vielleicht ein bisschen Vervielfältigung auf diese Weise beseitigen:

export const sizes: { [key: string]: Size } = [ 
    'small', 
    'medium', 
    'large', 
    'big', 
    'huge' 
].reduce((obj, s) => { 
    obj[s] = s 
    return obj 
}, {}) 

deutlich, dass mehr vorformulierten verwendet. Aber mit der Typbeschränkung sizes erhalten Sie zumindest eine Prüfung, die verhindert, dass ungültige Zeichenfolgen in das Objekt sizes gelangen.

+0

Ich musste darüber nachdenken, sorry. Aber ja, ich stimme zu, das ist ein sehr netter Weg, dies zu lösen. Genau das, was ich gesucht habe. Danke (Ich mag die erste Annäherung besser, aber die zweite ist zu kryptisch, braucht zu viel Energie, um es schnell in meinem Gehirn zu analysieren, um schnell zu verstehen, was eigentlich los ist) – soosap

+0

@ jessie-hallett das funktioniert super, ABER leider wenn ich annotiere Meine Objekte wie diese, Editoren wie vscode und atom loose autocomplete Fähigkeit auf die Eigenschaften, die auf einem Objekt existieren. Gibt es ein Heilmittel für dieses Problem? – soosap

+0

Ich habe ein Ticket für das Autocomplete-Problem eingereicht, wenn Sie möchten, folgen Sie einem Blick :) https://github.com/facebook/flow/issues/5431 – soosap