1. ホーム
  2. typescript

[解決済み] Typescriptでオブジェクトのプロパティを結合する方法は?

2022-03-10 14:43:03

質問

例えば、次のような2つのオブジェクトがあるとして、これを行う最良の方法を知りたいのです。

var objectA = {
    propertyA: 1,
    propertyB: 2
    ...
    propertyM: 13
}

var objectB = {
    propertyN: 14,
    propertyO: 15
    ...
    propertyZ: 26
}

でオブジェクトCを作成した場合

var objectC = Object.assign(objectA, objectB);

objectCがobjectAとobjectBの両方のプロパティを持つことをコンパイラやIDEに認識させるには、どのように宣言/記述すればよいのでしょうか?

オブジェクトAとオブジェクトBのインターフェイスを定義する必要がない方法を見つけたいのですが。同じプロパティの宣言と定義・評価を2回書きたくないんです。オブジェクトのプロパティが多すぎると、この冗長性が大きくなります。

(既存のオブジェクトのインターフェース/タイプを抽出できる演算子はありますか?)

可能ですか?

どのように解決するのですか?

これでいいようだ。

var objectA = {
    propertyA: 1,
    propertyB: 2,
    .
    . // more properties here
    .
    propertyM: 13
};

var objectB = {
    propertyN: 14,
    propertyO: 15,
    .
    . // more properties here
    .
    propertyZ: 26
};

var objectC = {...objectA, ...objectB}; // this is the answer

var a = objectC.propertyA;

var n = objectC.propertyN;

この記事に基づいています。 https://blog.mariusschulz.com/2016/12/23/typescript-2-1-object-rest-and-spread


さらに、分解における変数の順番も重要です。 次のように考えてみましょう。

var objectA = {
    propertyA: 1,
    propertyB: 2, // same property exists in objectB
    propertyC: 3
};

var objectB = {
    propertyX: 'a',
    propertyB: 'b', // same property exists in objectA
    propertyZ: 'c'
};

// objectB will override existing properties, with the same name,
// from the decomposition of objectA
var objectC = {...objectA, ...objectB}; 

// result: 'b'
console.log(objectC.propertyB); 

// objectA will override existing properties, with the same name,
// from the decomposition of objectB
var objectD = {...objectB, ...objectA}; 

// result: '2'
console.log(objectD.propertyB);