0Pricing
TypeScript Academy · レッスン

extendsによるジェネリック制約

型パラメーターを特定の形状に制限します。

「extendsによるジェネリック制約」はCoddyKit上の無料TypeScript Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはTypeScript Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 TypeScript Academyコースには全4レッスンが含まれています。

ようこそ

ジェネリック制約は、型引数として渡せる型を絞り込みます。`extends`を使用して、Tに特定のプロパティがあることや、特定の形状に一致することを要求します。

制約がない場合の問題

制約がないと、TypeScriptはTで有効な操作を判断できないため、すべての型に共通する操作しか許可しません。
function getLength<T>(val: T): number {
  // return val.length; // Error — T might not have .length
}

制約の追加

`T extends Shape`を使用して、Tが少なくともShapeのプロパティを持つことを要求します。
function getLength<T extends { length: number }>(val: T): number {
  return val.length;
}
getLength('hello');  // OK — string has .length
getLength([1, 2]);   // OK — array has .length
// getLength(42);   // Error — number has no .length

インターフェースへの制約

Tが特定のインターフェースを実装するよう制約します。
interface Named { name: string; }
function greet<T extends Named>(person: T): string {
  return 'Hello, ' + person.name;
}

keyof制約

`K extends keyof T`を使用して、KをTのキーに制約します。これにより、安全なプロパティアクセスが可能になります。
function getProperty<T, K extends keyof T>(obj: T, key: K): T[K] {
  return obj[key];
}
const age = getProperty({ name: 'Alice', age: 30 }, 'age'); // number

ユニオンへの制約

Tをユニオン型に制約して、型引数を特定の値に限定できます。
type Status = 'active' | 'inactive' | 'banned';
function setStatus<T extends Status>(status: T): void {
  console.log('Setting status:', status);
}

コンストラクターへの制約

Tをクラス(コンストラクターを持つ型)に制約すると、関数内でインスタンスを作成できます。
function create<T>(ctor: new () => T): T {
  return new ctor();
}

交差型による複数の制約

交差型を使用すると、Tが複数のインターフェースを満たすよう制約できます。
interface Serializable { serialize(): string; }
interface Loggable { log(): void; }
function process<T extends Serializable & Loggable>(item: T): void {
  item.log();
  console.log(item.serialize());
}

制約の継承

制約は継承にも対応します。Tが基底クラスを拡張している場合は、基底クラスのすべてのメソッドを呼び出せます。
class Animal { breathe() { return 'breathing'; } }
function care<T extends Animal>(a: T): string { return a.breathe(); }

T自身の拡張(再帰)

再帰的なデータ構造では、制約が自分自身を参照するように定義できます。
interface Comparable<T> { compareTo(other: T): number; }
function max<T extends Comparable<T>>(a: T, b: T): T {
  return a.compareTo(b) >= 0 ? a : b;
}

制約エラーメッセージ

型引数が制約を満たさない場合、TypeScriptは型引数と制約の両方を示す明確なエラーを報告します。

確認問題

`K extends keyof T`はKを何に制約しますか?

まとめ

`T extends SomeType`を使用して、ジェネリック型パラメーターを制約します。これにより、Tで特定のメソッドを呼び出したり、安全なプロパティアクセスのためにkeyofを使用したり、型安全なユーティリティを構築したりできます。

よくある質問

「extendsによるジェネリック制約」レッスンは無料ですか?

はい。「extendsによるジェネリック制約」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、TypeScript Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 TypeScript Academyコースには全4レッスンが含まれています。

「extendsによるジェネリック制約」で何を学びますか?

型パラメーターを特定の形状に制限します。 ブラウザで直接実行するハンズオンコードでTypeScript Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

TypeScript Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのTypeScript Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「extendsによるジェネリック制約」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このTypeScript Academyレッスンでコードを書いて実行できますか?

はい。すべてのTypeScript Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. ジェネリック関数:型パラメーター
  2. ジェネリックInterfaceと型エイリアス
  3. extendsによるジェネリック制約
  4. デフォルト型パラメーター
← TypeScript Academyに戻る