NEW KAWAII！TypeScriptで可愛いコードを書こう🍓

この記事はTypeScript Advent Calendar 2024 24日目の記事です。

https://qiita.com/advent-calendar/2024/typescript

## はじめに
こんにちは！添田です！🌟
某アイドルの歌のタイトルみたいな名前ですが、実はTypeScriptの機能を可愛く紹介するNEW KAWAII記事なんです🎀

## NEW KAWAII？！TypeScriptの魅力を発見しよう！
TypeScriptは進化を続けており、可愛くて便利な機能がどんどん追加されています！
今日はその中でも私がよく使う機能を、可愛く紹介していきますよ！
みなさんも一緒に<b>KAWAIIコード</b>でUpdateしてくださいね！

### 型エイリアスでアイドル情報を整理
```typescript
// アイドルの基本情報を型エイリアスで定義
type Idol = {
  name: string;
  age: number;
  nickname?: string;  // オプショナルプロパティで愛称は任意に！
  memberColor: string;
};

// アイドル情報を作成
const idol: Idol = {
  name: "月足 天音",
  age: 25,
  nickname: "あまねき",
  memberColor: "赤"
};

// テンプレートリテラルでかわいく表示！
console.log(`${idol.name}は、${idol.age}歳で、愛称は『${idol.nickname}』です！メンバーカラーは、${idol.memberColor}！KAWAII！`);

// Union型で衣装の種類も定義できちゃう！
type Costume = "ステージ衣装" | "私服" | "特典会衣装";
const todaysCostume: Costume = "ステージ衣装"; // これ以外は指定できないから安心！
```

### インターフェースでアイドルグループを表現
```typescript
// アイドルグループのインターフェースを定義
interface IdolGroup {
  groupName: string;
  members: Idol[];
  debutDate: Date;
}

// 実際のグループを作成！
const fruitZipper: IdolGroup = {
  groupName: "FRUITS ZIPPER",
  members: [
    { name: "月足 天音", age: 25, memberColor: "赤" },
    // 他のメンバーも追加できます！
  ],
  debutDate: new Date("2022-04-10")
};
```

### ジェネリクスでアイドルの活動を管理
```typescript
// ジェネリクスを使って様々な活動を記録できるクラスを作成
class IdolActivity<T> {
  private activities: T[] = [];

  addActivity(activity: T): void {
    this.activities.push(activity);
  }

  getLatestActivity(): T | undefined {
    return this.activities[this.activities.length - 1];
  }
}

// ライブ情報を管理するクラスを作成
interface LiveInfo {
  title: string;
  date: Date;
  venue: string;
}

const lives = new IdolActivity<LiveInfo>();
lives.addActivity({
  title: "FRUITS ZIPPER JAPAN TOUR 2024 - AUTUMN - THE STORY OF SEVEN COLORS ＠東京ガーデンシアター",
  date: new Date("2024-12-16"),
  venue: "東京都 東京ガーデンシアター"
});
```

### 非同期処理：去り際も可愛く
```typescript
// 握手会での非同期処理を可愛く表現！
async function handshakeEvent(seconds: number): Promise<string> {
  try {
    const message = await new Promise<string>((resolve) => {
      setTimeout(() => {
        resolve(`${seconds}秒お話できて嬉しかったよ！また来てね💖`);
      }, seconds * 1000);
    });
    return message;
  } catch (error) {
    return "ごめんね、なにかエラーが起きちゃった...😢";
  }
}

// async/awaitで可愛く使う！
async function startHandshake() {
  const message = await handshakeEvent(3);
  console.log(message);
}
```

### Optional Chaining & Nullish Coalescing：安全で可愛く
```typescript
const fanClubMember = {
  name: "ふるっぱー1号",
  membership: {
    level: "おまいつ",
    points: 9999999999999
  }
};

// Optional Chainingで安全にアクセス！
const memberPoints = fanClubMember.membership?.points ?? 0;
console.log(`現在のポイントは${memberPoints}ポイントです✨`);

// Nullish Coalescingでデフォルト値も可愛く設定！
const memberNickname = fanClubMember.nickname ?? "名無しのファン";
```

### デコレータでアイドル活動をログ化（TypeScript 5.0以降）
```typescript
// メソッドデコレータを作成
function logActivity(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
  const originalMethod = descriptor.value;
  descriptor.value = function(...args: any[]) {
    console.log(`アイドル活動ログ: ${propertyKey}を実行します！`);
    const result = originalMethod.apply(this, args);
    console.log(`アイドル活動完了！`);
    return result;
  };
  return descriptor;
}

class IdolPerformance {
  @logActivity
  perform(songTitle: string) {
    return `${songTitle}を歌います！`;
  }
}
```

## まとめ
今回は「NEW KAWAII！」というタイトルにぴったりな、TypeScriptの新しい機能を紹介しました😊

紹介した機能をまとめると、
- 型エイリアスとインターフェース：データの形を可愛く定義！❤️‍🔥
- ジェネリクス：様々な活動を型安全に管理！❤️‍🔥
- 非同期処理：Promise & async/await で綺麗に制御！❤️‍🔥
- Optional Chaining & Nullish Coalescing：安全で可愛いコードに！❤️‍🔥
- デコレータ：コードを可愛くデコレーション！❤️‍🔥

これらの機能を使えば、コードがもっともっとKAWAIIになりますね！

## 今回登場した今イチオシのアイドル！
https://fruitszipper.asobisystem.com/