2017-12-20 4 views
0

Object.assignを使用してトップレベルのプロパティが矛盾している場合にエラーをスローする方法はありますか?または、手動で機能を記述する必要がありますか?Object.assignだが名前が衝突するとエラーが発生する

+0

は、あなたの質問 – Krishjs

+2

'Object.assign'を使用する大きな理由を説明するためにいくつかのコードを追加します。これはObject.assign()の動作ではありませんので、別の名前で新しい関数であることが適切と思われます不変性のために新しいプロパティの代わりに既存のプロパティをオーバーライドすることです... – Li357

+0

プロキシオブジェクトを使用できますか? – zabusa

答えて

4

トップレベルのプロパティが衝突している場合、それはエラーをスローするようにObject.assignを使用する方法はありますか?

いいえあなたが求めているのは、Object.assign()の機能ではありません。

また、手動で機能を記述する必要がありますか?

はい、あなた自身で作成するか、他の誰かがすでに作成したものを見つける必要があります。トップレベルのソースプロパティが既にターゲット上のプロパティと一致する場合にスローされる別の関数を次に示します。

function mergeObjects(target, ...sources) { 
    let originalProperties = new Set(Object.keys(target)); 
    // preflight for any top-level property name conflicts so we can throw before copying anything 
    for (let src of sources) { 
     for (let prop of Object.keys(src)) { 
      if (originalProperties.has(prop)) { 
       throw new Error(`target already has property ${prop}`); 
      } 
     } 
    } 
    return Object.assign(target, ...sources); 
} 
0

エラーをスローする関数によってObject.assignを上書きすることができます。 Object.assignに現在エラーをスローするように指示するパラメータはありません。

Object.assign = function() { 
    // check in arguments if property class 
    throw "Error"; 
} 
+1

おそらく非常に悪いアイデアは、任意のコードベースでこれを上書きする –

+0

はい。同意する。しかし、私が言ったように、それは唯一の方法です。 –

1
let a = {1: '1', 2: '2', 3: '3'} 

const pDummy = new Proxy(a, { 
    set: function(target, prop, value, receiver) { 
    if(target[prop] === undefined){ 
     target[prop] = value; 
     // Reflect.set(target, prop, value); 
     return true 
    } 
    else { 
     throw new Error(`Already assigned property ${prop} `); 
     // return false; 
    } 
    } 
}) 

const test = Object.assign(pDummy, {4:'4', 5: '5'}); 
console.log('test', test); 
const test1 = Object.assign(pDummy, {1:'4', 8: '5'}); 
console.log('test1', test1); 
+0

素敵な考え方、それがうまくいくかどうかわかりませんか? –

+0

@AlexanderMillsありがとう – zabusa

関連する問題