2017-02-13 20 views
11

sagen, dass ich die folgende Konstante Zeichenfolge haben:Bewegungsarten mit konstanter Strings und abhängige Typen

export default const FOO = 'FOO'

Sagen wir, ich importieren diese in einem Strömungs kommentierten Datei wie folgt:

import FOO from '../consts/Foo'

Ich habe dann eine Funktion:

const example = (foo : string) : {| type: FOO, foo: string |} => { 
    return {type: FOO, foo: foo} 
} 

Dies gilt nicht typecheck mit:

6: const example = (foo : string) : {| type: FOO, foo: string |}=> { 
                 ^^^^^^^^^^^^^^ string. Ineligible value used in/as type annotation (did you forget 'typeof'?) 
    6: const example = (foo : string) : {| type: FOO, foo: string |}=> { 
                 ^^^^^^^^^^^^^^ FOO 

Also meine Fragen sind:

1) ist es möglich, Konstanten in Bewegungsarten zu verwenden, wie kann ich dieses Verhalten zu reproduzieren?

2) Ist es möglich, abhängige Typen im Fluss zu tun? also könnte ich zum Beispiel über Typen codieren, dass die zurückgegebene Zeichenfolge dieselbe Zeichenfolge sein muss, die an die Funktion example übergeben wird?

EDIT: Klarstellung zu Teil 2: Ist es möglich, in irgendeiner Art und Weise anzuzeigen, dass die foo Parameter übergaben in die example Funktion in der Tat ist die gleiche Zeichenfolge als Zeichenfolge am foo Schlüssel im Rück Objekt? Oder um zu behaupten, dass die Eingabe und die Ausgabe die gleiche Länge haben (zum Beispiel eine Verschiebechiffrefunktion). Oder sagen Sie eine Permutation der gleichen Charaktere enthalten? (für ein Mischen).

https://en.wikipedia.org/wiki/Dependent_type

+0

Wenn Sie möchten, dass 'FOO' den Typ' 'FOO'' hat, müssen Sie es deklarieren, sonst ist es nur eine Zeichenkette. Für die Objekte würden Sie dann 'type: typeof FOO' eingeben, wie der Fehler sagt. Ich bin mir nicht ganz sicher, was Sie in Ihrem 2) Punkt fragen. Dann würden Sie mit einem Objekt mit zwei Eigenschaften mit dem gleichen Zeichenfolgenwert enden. – loganfsmyth

Antwort

5

Statt FOO als const zu erklären, erklären sie als disjunkte Vereinigung mit nur einem Zweig:

type FOO = "FOO" 

Dann kann der Code wie folgt aktualisiert werden:

const example = (foo : string) : {| type: FOO, foo: string |} => { 
    return {type: "FOO", foo: foo} 
} 

Wenn Sie einen Wert neben dem exakten Zeichenfolgenliteral "FOO" verwenden, in dem sich FOO befindet erforderlich, dann ist es ein Kompilierungsfehler.

Wenn Sie Ihre Konstante beibehalten möchten, müssen Sie den Typ anders benennen, da sie kollidieren würden. So könnten Sie tun:

const FOO = "FOO" 
type FooType = "FOO"; 

const example = (foo : string) : {| type: FooType, foo: string |} => { 
    return {type: FOO, foo: foo} 
} 

Leider kann ich nicht sehen, wie man die Stringliteral zu vermeiden duplizieren, weil Typ disjunkte Vereinigung Definition Syntax nur Literale und Typen erlaubt, keine Variablen, auch wenn sie Konstanten sind.

+0

für Flux Standard-Aktionsmuster der Definition von Aktionstypen als Strings, um einige der quotemarks aus dem Code zu löschen, ist dies ein sehr interessantes Muster. Auf diese Weise, und korrigieren Sie mich, wenn ich falsch liege, kann ich einen Meta-Typ definieren 'ValidResponses = FOO | BAR; 'und stellen Sie sicher, dass API-Funktionsaufruf eine korrekte Antwort zurückgibt, nicht nur eine korrekte Art von Daten. – ermik