2016-10-13 3 views
5

Ich möchte ein Objekt kopieren, während nur eine einzelne Eigenschaft geändert wird. Ohne Durchfluss, könnte ich dies tun das Objekt Ausbreitung Operator wie folgt aus:Objektspreizer in Flow

class Point { x: number = 10; y: number = 10; } 
const p1 = new Point(); 
const p2 = {...p1, y: 5}; 

Aber wenn ich hinzufügen Typenannotationen auf P1 und P2 wie folgt aus:

const p1 = new Point(); 
const p2 = {...p1, y: 5}; 

bekomme ich folgende Fehlermeldung:

11: const p2:Point = {...p1, y: 5}; 
         ^^^^^^^^^^^^^ object literal. This type is incompatible with 
11: const p2:Point = {...p1, y: 5}; 
      ^^^^^ Point 

Wie würde ich diese Art von Operation auf eine Art sichere Weise in Flow erreichen?

Als Beispiel in Elm, ich kann dies tun:

p2 = { p1 | y = 5 } 

Es muss ein entsprechender Betrag in Fluss sein.

Antwort

2

Wenn Sie (wirklich) benötigen eine class anstelle eines type alias Sie die Elm-Syntax mit nur einem Argument p2 = { p1 | y = 5 } durch die Definition eines Konstruktor simulieren kann

export class Point { 
    x: number = 10; 
    y: number = 10; 
    constructor(fields?: { x: number, y: number }) { 
    Object.assign(this, fields) 
    } 
} 
const p1 = new Point() 
const p2: Point = new Point({...p1, y: 5}) 
3

Wenn Sie Objektverteilung verwenden, erhalten Sie keine genaue Kopie eines Objekts. Stattdessen erhalten Sie ein einfaches Objekt, in das alle Eigenschaften des Quellobjekts kopiert werden. Also, Flow ist genau hier, p2 ist nicht Point. Versuchen Sie stattdessen:

type Point = { x: number, y: number }; 
const p1: Point = { x: 10, y: 10 }; 
const p2: Point = { ...p1, y: 5 }; 
+0

Also was wäre der typsichere Flow-Weg, um dies zu tun? –

+0

Oh Entschuldigung. Ich habe nicht bemerkt, dass das, was du gezeigt hast, einen Typ anstelle einer Klasse benutzt. Das * beantwortet * die Frage. –

3

Erläuterung: class tut funktioniert nicht, weil es nominal typing verwendet, aber type funktioniert, weil das strukturelle Typisierung verwendet.