2016-10-13 8 views
5

単一のプロパティだけを変更しながらオブジェクトをコピーしたいとします。フローがなければ、私はこのようなオブジェクトの広がり演算子を使用してこれを行うことができます:フロー内のオブジェクトスプレッド演算子

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

私は次のエラーを取得する:

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

をしかし、私はこのようにP1およびP2に型注釈を追加するとき

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

フローでタイプセーフな方法でこのタイプの操作を達成するにはどうすればよいですか?一例として、

は、エルムでは、私がこれを行うことができます:

p2 = { p1 | y = 5 } 

の流れで、いくつかの同等が存在する必要があります。

答えて

2

ます(実際には)あなたが

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

オブジェクトスプレッドを使用すると、オブジェクトの正確なコピーを取得できません。代わりに、すべてのソースオブジェクトのプロパティをコピーしたプレーンオブジェクトを取得します。したがって、フローはここにあります。p2Pointではありません。代わりにこれを試してみてください:

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

どのような種類の安全になるでしょうこれを行う方法は? –

+0

申し訳ありません。私は、あなたが見せていることがクラスの代わりに型を使うことであることに気づいていませんでした。それは質問に答えます*。 –

3

説明のみ1つの引数でコンストラクタを定義することによって、エルム構文p2 = { p1 | y = 5 }をシミュレートすることができclass代わりtypeの別名が必要な場合:classはありません構造型を使用しているため、nominal typingが使用されていますが、typeが機能するため動作しません。

関連する問題