spinny:~/writing $ vim advanced-typescript-patterns.md
1~2TypeScriptは、大規模なウェブ開発の業界標準になりました。ほとんどの開発者はインターフェースと型の基本を知っていますが、本当の力はその高度な型システムにあります。ここでは、シニアエンジニアとしてあなたを際立たせる5つのパターンを紹介します。3~4## 1. ジェネリック制約 (Generic Constraints)5~6ジェネリクスは強力ですが、渡すことができるものを制限する必要がある場合があります。ここでは `extends` が役立ちます。7~8```typescript9interface HasId {10 id: string;11}12~13function getById<T extends HasId>(list: T[], id: string): T | undefined {14 return list.find((item) => item.id === id);15}16```17~18`T` が `HasId` を拡張することを保証することで、関数内での `.id` へのアクセスが安全であることを保証します。19~20## 2. 条件付き型 (Conditional Types)21~22条件付き型を使用すると、不均一な型マッピングを作成できます。構文はJavaScriptの三項演算子に似ています。23~24```typescript25type IsString<T> = T extends string ? true : false;26~27type A = IsString<string>; // true28type B = IsString<number>; // false29```30~31実用的なユースケースは、共用体から型を除外することです。32~33```typescript34type Diff<T, U> = T extends U ? never : T;35type NonNullable<T> = Diff<T, null | undefined>;36```37~38## 3. マップ型 (Mapped Types)39~40マップ型を使用すると、プロパティを変換することで、古い型に基づいて新しい型を作成できます。41~42```typescript43type ReadOnly<T> = {44 readonly [P in keyof T]: T[P];45};46~47interface User {48 name: string;49 age: number;50}51~52type ReadOnlyUser = ReadOnly<User>;53```54~55修飾子を追加または削除することもできます。56~57```typescript58type Mutable<T> = {59 -readonly [P in keyof T]: T[P];60};61```62~63## 4. テンプレートリテラル型 (Template Literal Types)64~65TypeScript 4.1で導入されたこれらは、文字列型を直接操作することを可能にします。66~67```typescript68type World = 'world';69type Greeting = `hello ${World}`; // "hello world"70~71type Color = 'red' | 'blue';72type Quantity = 'light' | 'dark';73~74type Palette = `${Quantity}-${Color}`;75// "light-red" | "light-blue" | "dark-red" | "dark-blue"76```77~78これは、CSSクラスやイベント名など、特定のパターンに従う文字列を入力するのに非常に便利です。79~80## 5. `infer` キーワード81~82条件付き型内の `infer` キーワードを使用すると、他の型から型を抽出できます。83~84```typescript85type ReturnType<T> = T extends (...args: any[]) => infer R ? R : any;86~87function check(): boolean {88 return true;89}90~91type CheckReturn = ReturnType<typeof check>; // boolean92```93~94ここでは、TypeScriptに関数の戻り値の型 `R` を「推論」して返すように求めています。95~96## 結論97~98これらのパターンを習得すると、堅牢で優れた開発者エクスペリエンス(DX)を提供するライブラリとユーティリティを作成できます。高度なTypeScriptの目標は、複雑さのための複雑さではなく、安全性と表現力です。99~
NORMAL · advanced-typescript-patterns.md [readonly]99 lines · :q to close