2016-10-27 6 views
2

Lassen Sie uns sagen, dass wir eine sehr einfache Objekttyp definiert haben:den Typ einer Objekteigenschaft in einer Bewegungsart

type A = { 
    foo: string, 
    bar: number, 
    // ... many other properties 
}; 

Nun möchten wir eine Variante dieser Art definieren, nur ersetzt die Art der foo von ?string:

type A2 = { 
    foo: ?string, 
    bar: number, 
    // ... many other properties, with the same types as in A 
}; 

Wie das getan werden kann, ohne wieder die ganze Art definieren zu müssen?

Es wäre genug, wenn die Antwort nur in dem speziellen Fall der Ersetzung des Eigenschaftstyps T durch ?T funktionierte, da das mein häufigstes Problem ist.

Antwort

3

kann ich denke an zwei Lösungen:

1) ein parametrischer Typ alias

type Parametric<T> = { 
    foo: T, 
    bar: number, 
    // ... many other properties 
}; 

type A = Parametric<string>; 
type B = Parametric<?string>; 

2) Kreuzungen

type Base = { 
    bar: number, 
    // ... many other properties 
}; 

type A = Base & { foo: string }; 
type B = Base & { foo: ?string }; 
+0

Lösung 1 wäre perfekt für einen Parameter (das ist, was ich gefragt habe, also markiere ich als die akzeptierte Antwort). Es kann jedoch mühsam werden, wenn die Anzahl der zu ändernden Eigenschaften zunimmt. –

+0

Ist es unmöglich, eine Eigenschaft von einem Typ zu entfernen (vielleicht über eine Direktive $ Xxxx), ohne den ursprünglichen Typ ändern zu müssen? –

+0

Es gibt '$ Diff' aber mit einem anderen Verhalten am Ende: [Flowtype/try] (https://flowtype.org/try/#0C4TwDgpgBAglC8UDeAoKUBmB7LAuKAzsAE4CWAdgOYA0aUARgIbH7kCuAtvRMbegPT8oAOlFQOjciChZgACx5QwxLJGLBSEAigC+AbhQpQkKACEEUACQARUhgwAeGNWSYc+ImSpQdAPgMoABRIbnhQAOSM4S5MLFAAjD74MACUBsGh+GzkACYQGBQQOTHM+Ik6+KZpQSHYYewANg0lceWVaVCCUA6IPCrENQylCUlmKZ1CPVDypARQs1CMTVgA7kUoQA) – gcanti

0

ich die Ausbreitung Operator mit genauen Typen verwenden würden (eingeführt in Fluss v0.42.0).

type A = {| 
    foo: string, 
    bar: number, 
    // ... many other properties 
|} 

type A2 = { 
    ...A, 
    foo: ?string 
} 

Hinweis: You need to use an exact type for A (die {| ... |} Syntax). Dies ist darauf zurückzuführen, wie der Flow bei der Verteilung nicht versiegelte (nicht exakte) Typen handhabt.

Verwandte Themen