2016-10-13 24 views
5

Sadece tek bir özelliği değiştirirken bir nesneyi kopyalamak istiyorum. Akış olmadan, böyle nesne yaymak operatörü kullanılarak yapabilirsiniz:Akışta nesne yayılma operatörü

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

aşağıdaki hatayı alıyorum:

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

Ama hiç böyle p1 ve p2 tipi ek açıklamaları eklediğinizde

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

Flow'ta bu tür bir işlemi nasıl güvenli bir şekilde gerçekleştirebilirim? Örnek olarak

, Elm, ben bunu yapabilirsiniz:
p2 = { p1 | y = 5 } 

Akış bazı eşdeğer olmalı.

cevap

2

Eğer (gerçekten) Eğer

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

Nesne yayılımı kullandığınızda, bir nesnenin tam kopyasını almazsınız. Bunun yerine, tüm kaynak nesnenin kopyalanan özellikleri ile sade bir nesne elde edersiniz. Yani, Akış burada, p2Point değildir. Bunun yerine bu deneyin:

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

Peki bunu yapmak için güvenli akış yolu ne olurdu? –

+0

Üzgünüm. Gösterdiğin şeyin bir sınıf yerine bir tür kullanmak olduğunu anlayamadım. Bu * soruya cevap veriyor. –

3

açıklama yalnızca bir argüman ile bir kurucu tanımlayarak Elm sözdizimi p2 = { p1 | y = 5 } taklit bir class yerine type bir diğer adını gerekirse: class yapar Çalışmıyor çünkü bu, nominal typing kullanıyor, ancak type çalışır çünkü bu, yapısal yazım kullanır.