そうじゃないだろう@災い転じて福となす

# 災い転じて福となす

まとめ
`const { 服, 茄子 } = 災い.転じる()`がしたかっただけ

```index.ts
import { 服 as 服クラス } from "./服";
import { 茄子 as 茄子クラス } from "./茄子";

class わざわい {
  服: 服クラス;
  茄子: 茄子クラス;
  constructor() {
    this.服 = new 服クラス();
    this.茄子 = new 茄子クラス();
  }

  public 転じる() {
    return {
      服: this.服,
      茄子: this.茄子,
    };
  }
}

const 災い = new わざわい();

const { 服, 茄子 } = 災い.転じる();

服.眺める();

服.着る();

茄子.焼く();

茄子.食べる();

服.脱ぐ();

茄子.眺める();

```

``` 服.ts
enum 服のサイズ {
  XS = 1,
  S = 2,
  M = 3,
  L = 4,
  XL = 5,
}

enum 服の色 {
  RED = 1,
  BLUE = 2,
  YELLOW = 3,
  GREEN = 4,
  BLACK = 5,
  WHITE = 6,
  PINK = 7,
  PURPLE = 8,
  ORANGE = 9,
  BROWN = 10,
}
function 色ゲットだぜ(value: number | undefined): string | undefined {
  for (const [key, val] of Object.entries(服の色)) {
    if (val === value) {
      return key;
    }
  }
  return undefined;
}

function サイズゲットだぜ(value: number | undefined): string | undefined {
  for (const [key, val] of Object.entries(服のサイズ)) {
    if (val === value) {
      return key;
    }
  }
  return undefined;
}

export class 服 {
  サイズ: 服のサイズ | undefined; // undefinedはフリーサイズ
  色: 服の色 | undefined; // undefinedは透明
  constructor() {
    // 服のサイズと色はランダム
    this.サイズ = Math.floor(Math.random() * 5) + 1;
    this.色 = Math.floor(Math.random() * 10) + 1;
  }

  public 着る(): void {
    console.log("服を着た");
  }
  public 脱ぐ(): void {
    console.log("服を脱いだ");
  }
  public 眺める(): void {
    console.log("わぁ! 服だ!");
    console.log(
      `サイズ: ${サイズゲットだぜ(this.サイズ)}, 色: ${色ゲットだぜ(this.色)}`
    );
    console.log();
  }
}

```

```茄子.ts
enum 長さ {
  めっちゃ短い = 0,
  短い = 1,
  普通 = 2,
  長い = 3,
  めっちゃ長い = 4,
  果てしなく長い = 5
}

function 長さゲットだぜ(value: number | undefined): string | undefined {
  for (const [key, val] of Object.entries(長さ)) {
    if (val === value) {
      return key;
    }
  }
  return undefined;
}

enum 太さ {
  めっちゃ細い,
  細い,
  普通,
  太い,
  ごりごりに太い,
  とんでもなく太い
}

function 太さゲットだぜ(value: number | undefined): string | undefined {
  for (const [key, val] of Object.entries(太さ)) {
    if (val === value) {
      return key;
    }
  }
  return undefined;
}

export class 茄子 {
  長さ: 長さ;
  太さ: 太さ;
  constructor() {
    // 茄子の長さと太さはランダム。果てしなく長い、とんでもなく太いは3%の確率で出現
    if (this.isRare()) {
      this.長さ = 長さ.果てしなく長い;
    } else {
      this.長さ = Math.floor(Math.random() * 5);
    }
    if (this.isRare()) {
      this.太さ = 太さ.とんでもなく太い;
    } else {
      this.太さ = Math.floor(Math.random() * 5);
    }
  }
  private isRare(): boolean {
    return Math.random() < 0.03;
  }

  public 焼く(): void {
    console.log("茄子を焼いた");
  }
  public 食べる(): void {
    console.log("茄子を食べた");
  }
  public 眺める(): void {
    console.log("これは茄子ですね。")
    // どちらかがレアの場合、レアな表示にする。
    // どちらもレアの場合、すっごくレアな表示にする。
    // すっごくレア
    if (this.長さ === 長さ.果てしなく長い && this.太さ === 太さ.とんでもなく太い) {
      console.log("激レア茄子");
      return;
    }
    // どちらかがレア
    if (this.長さ === 長さ.果てしなく長い || this.太さ === 太さ.とんでもなく太い) {
      console.log("レア茄子");
      return;
    }
    
    console.log(`長さ: ${長さゲットだぜ(this.長さ)}, 太さ: ${太さゲットだぜ(this.太さ)}`);
  }
}
```

>激レア茄子を引けるように頑張ろう

# ここからは補足

さすがにひどいかもしれないので、この記事のクライマックスである下記の動作を説明しよう(説明しようっ(キリッ))

```typescript
const { 服, 茄子 } = 災い.転じる();
```

これは、下記みたいなことを1行でかけてしまうすごい書き方
```typescript
const result = 災い.転じる();
const 服 = result.服
const 茄子 = result.茄子
```
>すっきりするね！

やりすぎると意味わかんなくなるけど。
ネストもいけるし、エイリアスもできるし。超かっこいい！！
```typescript
const objA = {
    nickName: "Taro",
    age: {
        forPrivate: 22,
        forPublic: 16
    }
}

const {
    nickName: name,
    age: {
        forPublic: age
    }
} = objA

console.log(name) // Taro
console.log(age) // 16

```