TypeScript - ユーティリティタイプ

こんにちは、未来のプログラミング魔法使いの皆さん!今日は、TypeScriptの魔法の領域であるユーティリティタイプの冒険旅行に一起に出発しましょう。プログラミングが初めての方也不用担心;私はあなたの親切なガイドとして、これらの概念を一起にステップバイステップで探求します。那么、バーチャルな魔杖(キーボード)を握りしめ、一緒に飛び込みましょう!

TypeScript - Utility Types

ユーティリティタイプとは?

始める前に、ユーティリティタイプとは何かを理解しましょう。想象して見てください。様々な道具が詰まった工具箱があります。それぞれの道具は特定のタスクをより効率的に行う助けになります。TypeScriptにおけるユーティリティタイプもまさにそれと同じです。それらは、型を簡単に操作し、変換するための préビルトされたツールです。

那么、これらの魔法の道具を一つずつ見ていきましょう!

TypeScriptのPartial型

Partial型は、オブジェクト内のすべてのプロパティをオプションにする魔法の呪文です。オブジェクトを作成する際に、すべてのプロパティを指定する必要がない場合に非常に便利です。

以下にその動作を見てみましょう:

interface Wizard {
name: string;
age: number;
house: string;
}

function updateWizard(wizard: Wizard, fieldsToUpdate: Partial<Wizard>) {
return { ...wizard, ...fieldsToUpdate };
}

const harryPotter: Wizard = {
name: "Harry Potter",
age: 11,
house: "Gryffindor"
};

const updatedHarry = updateWizard(harryPotter, { age: 17 });
console.log(updatedHarry);
// 出力: { name: "Harry Potter", age: 17, house: "Gryffindor" }

この例では、Partial<Wizard>を使用することで、ハリーの年齢を更新するだけで他のすべてのプロパティを指定する必要がありません。まるで「部分顕現の呪文」を唱えたかのようです!

TypeScriptのRequired型

Required型は、Partial型の逆です。オブジェクト内のすべてのプロパティを必須にする魔法の呪文です。元々オプションであったプロパティも必須になります。

以下にその動作を見てみましょう:

interface MagicalCreature {
name: string;
power?: string;
age?: number;
}

const dragon: Required<MagicalCreature> = {
name: "Norwegian Ridgeback",
power: "Fire Breath",
age: 2
};

// これはエラーを引き起こします:
// const unicorn: Required<MagicalCreature> = {
//   name: "Silver Horn"
// };

ここでは、元々オプションであったpowerageプロパティも、Required型により必須になります。まるで「全プロパティを呼び寄せる呪文」を唱えたかのようです!

TypeScriptのPick型

Pick型は、既存の型から特定のプロパティを選択して新しい型を作成することを可能にします。まるで召還呪文を使って必要なプロパティだけを呼び寄せるようなものです。

以下にその動作を見てみましょう:

interface Potion {
name: string;
ingredients: string[];
brewingTime: number;
effect: string;
}

type PotionLabel = Pick<Potion, 'name' | 'effect'>;

const polyjuicePotion: PotionLabel = {
name: "Polyjuice Potion",
effect: "飲むと別の人に変身する"
};

この例では、PotionLabel型を作成し、Potionインターフェースから「name」と「effect」プロパティだけを含めています。特定の詳細が必要な場合に非常に適しています!

TypeScriptのOmit型

Omit型は、Pick型の逆です。既存の型から特定のプロパティを削除して新しい型を作成します。まるで特定のプロパティに消失呪文をかけたかのようです!

以下にその動作を見てみましょう:

interface SpellBook {
title: string;
author: string;
pages: number;
secretSpell: string;
}

type PublicSpellBook = Omit<SpellBook, 'secretSpell'>;

const beginnerSpellBook: PublicSpellBook = {
title: "Standard Book of Spells, Grade 1",
author: "Miranda Goshawk",
pages: 250
};

ここでは、PublicSpellBook型を作成し、SpellBookインターフェースの「secretSpell」プロパティ以外すべてを含めています。まるで「秘密以外すべてを見せる呪文」を唱えたかのようです!

TypeScriptのReadonly型

Readonly型は、プロパティに保護呪文をかけたかのようです。オブジェクト内のすべてのプロパティを読み取り専用にし、事故的な変更を防ぎます。

以下にその動作を見てみましょう:

interface Wand {
wood: string;
core: string;
length: number;
}

const harryWand: Readonly<Wand> = {
wood: "Holly",
core: "Phoenix feather",
length: 11
};

// これはエラーを引き起こします:
// harryWand.length = 12;

Readonlyを使用することで、一旦作成された wand のプロパティが変更されることがなくなります。まるでオブジェクトに不壊の呪文をかけたかのようです!

TypeScriptのReturnType型

ReturnTypeユーティリティ型は、関数の返り値の型を抽出します。まるで関数の中を見て、何を返すかを覗見するようなものです!

以下にその動作を見てみましょう:

function castSpell(spellName: string): { name: string, power: number } {
// 魔法を唱えるロジックここに
return { name: spellName, power: Math.random() * 100 };
}

type SpellResult = ReturnType<typeof castSpell>;

const lumos: SpellResult = {
name: "Lumos",
power: 50
};

この例では、SpellResultcastSpellの返り値の型として{ name: string, power: number }と推論されます。複雑な関数を扱う際に非常に便利です!

TypeScriptのRecord型

Record型は、特定のキー型と値型を持つオブジェクト型を作成する強力な呪文です。まるで魔法の地図を呼び寄せて、キーと値を定義するようなものです。

以下にその動作を見てみましょう:

type HouseCup = Record<string, number>;

const housePoints: HouseCup = {
"Gryffindor": 472,
"Hufflepuff": 352,
"Ravenclaw": 426,
"Slytherin": 472
};

ここでは、HouseCup型はキーが文字列(学院名)、値が数値(ポイント)を持つ型です。これにより、学院ポイントのオブジェクトが正しい構造を持つことを確認できます。

TypeScriptのNonNullable型

NonNullable型は、nullおよびundefined値を排除する呪文のようです。特定の型からnullおよびundefinedを除いた新しい型を作成します。

以下にその動作を見てみましょう:

type MagicalItem = string | number | null | undefined;

type DefiniteMagicalItem = NonNullable<MagicalItem>;

const definiteItem: DefiniteMagicalItem = "Invisibility Cloak";
// これはエラーを引き起こします:
// const nullItem: DefiniteMagicalItem = null;

この例では、DefiniteMagicalItemはstringまたはnumber型で、nullまたはundefinedではありません。実際の値を扱う際に非常に便利です!

ユーティリティタイプのチートシート

ここに、私たちがカバーしたすべてのユーティリティタイプの簡単な参照表を示します:

ユーティリティタイプ 説明
Partial T内のすべてのプロパティをオプションにする Partial<Wizard>
Required T内のすべてのプロパティを必須にする Required<MagicalCreature>
Pick<T, K> TからKのプロパティだけを持つ型を作成する Pick<Potion, 'name' | 'effect'>
Omit<T, K> TからKのプロパティを除いた型を作成する Omit<SpellBook, 'secretSpell'>
Readonly T内のすべてのプロパティを読み取り専用にする Readonly<Wand>
ReturnType 関数型Tの返り値の型を抽出する ReturnType<typeof castSpell>
Record<K, T> キーが型K、値が型Tを持つオブジェクト型を作成する Record<string, number>
NonNullable Tからnullおよびundefinedを除いた型を作成する NonNullable<MagicalItem>

そして、若い魔法使いの皆さん!あなたは今、TypeScriptの基本魔法であるユーティリティタイプをマスターしました。魔法は練習でより強力になります。那么、继续実験し、間もなく「Wingardium Leviosa」と同じようにこれらの型を簡単に唱えることができるようになるでしょう!

Credits: Image by storyset