eoao
@eoao

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

プロパティ名が異なる2つのオブジェクト間でデータを代入したい

Q&A

Closed

解決したいこと

それぞれ定義されているプロパティがことなる2つのオブジェクトのデータを
片方に代入?データを入れる?良い方法を教えていただきたいです。

// プロパティ名は異なるが、構造は同じ
interface Test1 {
  hoge: string,
  fuga: string[],
  piyo: { piyopiyo1: string, piyopiyo2: string }
}
interface Test2 {
  foo: string,
  bar: string[],
  baz: { baz1: string, baz2: string }
}

// hogeにfooの値をいれたい

自分で試したこと

片方の型の変数を用意して、データが入っている方を一つ一ついれていくしか思い付きませんでした。
これしか方法はないのでしょうか?
仮にTest1とTest2が配列になっていた場合はループさせるしかないのでしょうか?

0

2Answer

ループ時はfor(let x of y)で配列番号を反復取得できるので、インデックスを指定してプロパティを呼び出す方法が簡易です
最もデータ構造が同一であれば型を一つに統一するか、片方の型のインスタンスをもう片方でプロパティに保持しておくことが推奨されます

0Like

Comments

  1. @eoao

    Questioner

    ありがとうございます。
    本来はおっしゃられている通り、同じものを使う方が良いと思います。
    今回はapiからの戻り値をそのままではなく一度こちら側で定義した型にいれないといけないのですが、それのプロパティ名が異なっているためどうすれば良いのか悩んでいました。

    片方の型のインスタンスをもう片方でプロパティに保持しておくことが推奨されます

    こちらですが、どのようなことかわかりませんでした。
    例えばTest2にTest1の型のプロパティを一つ追加してそこに持てるようにするということでしょうか?
    教えていただきたいです。

  2. その通り、Test1Test2のインスタンスを参照するなどしておくことです

    interface Test1{
     test2:Test2
    }
    

    一度こちら側で定義した型にいれないといけない

    これが目的であれば、インスタンス全体を複製するなどの用途があると思われるので、Test2をラップしておくことでそのような操作が可能です

    const test2:Test2={…}
    
    const test1:Test1={
     test2:{…test2} //複製
    }
    
  3. @eoao

    Questioner

    なるほど。教えていただいた書き方は知らなかったので参考になりました。
    ありがとうございます!!

下記みたいに揃えたらいいってことでしょうか?

interface Test1 {
  hoge: string,
  fuga: string[],
  piyo: { piyopiyo1: string, piyopiyo2: string }
}

interface Test2 {
  foo: string,
  bar: string[],
  baz: { baz1: string, baz2: string }
}
class WrapperTest1 implements Test1 {
  #self: Test2;
  #internalPiyo: Test1["piyo"];
  constructor(v: Test2) {
    this.#self = v;
    this.#internalPiyo = new (class {
      #self: Test2;
      constructor(v: Test2) {
        this.#self = v;
      }
      get piyopiyo1() { return this.#self.baz.baz1; }
      set piyopiyo1(piyopiyo1: string) { this.#self.baz.baz1 = piyopiyo1; }
      get piyopiyo2() { return this.#self.baz.baz2; }
      set piyopiyo2(piyopiyo2: string) { this.#self.baz.baz2 = piyopiyo2; }
    })(v);
  }
  get hoge() { return this.#self.foo; }
  set hoge(hoge: string) { this.#self.foo = hoge; }
  get fuga() { return this.#self.bar; }
  set fuga(fuga: string[]) { this.#self.bar = fuga; }
  get piyo() { return this.#internalPiyo; }
}

0Like

Comments

  1. @eoao

    Questioner

    中身難しくて完全に理解しているとは言えないですが、
    各プロパティの中身をもらって設定している感じですかね?
    あってます!確かにメソッドの引数でもらって設定するでもできますね。
    思いつきませんでした。ありがとうございます!

  2. そうです。そうです。

Your answer might help someone💌