Menu

TypeScriptの型エイリアス(type): 使い方と例

型エイリアスは、type キーワードであらゆる型に名前を付けます。オブジェクトの形、ユニオン型、タプル、関数、ジェネリクス、再帰的な型です。構文、それぞれの形の書き方、そしてエイリアスは名前にすぎず、別の新しい型ではない理由を解説します。

このページのコードはエディタで実行できます - 編集してすぐに結果を確認できます。

型エイリアスは型に名前を付けます。type Name = ... と書くと、それ以降、型が期待される場所ならどこでも Name を使えます。インターフェースと違い、エイリアスはオブジェクトの形だけでなく、どんな型にも名前を付けられます。

エイリアスはコンパイル時にしか存在しません。出力されるJavaScriptには、これらの type の行は1つも含まれません。

構文

type Name = SomeType;
type Name<T> = SomeTypeUsing<T>;       // generic
export type Name = SomeType;           // exported from a module

名前は慣習では PascalCase です。右辺はどんな型の式でもよく、エイリアスはほかのエイリアスや自分自身も使えます(下の再帰的な型を参照)。型はコンパイル時にチェックされ、const や let のように順番に実行されるわけではないので、エイリアスは宣言の行より上も含め、宣言されたスコープ全体で使えます。

オブジェクト型

オブジェクトの形なら、エイリアスとインターフェースはほとんど同じように書きます。エイリアスは = を使い、ふつうはセミコロンで終えます。

エイリアスでは extends を使えず、交差型 & がその役割を果たします。余分なプロパティのチェック、省略可能なプロパティと readonly プロパティは、インターフェースとまったく同じように動きます。オブジェクトの形にどちらを選ぶかは、interface と type のページで扱います。

ユニオン型、タプル、関数

これらはエイリアスでしか名前を付けられないもので、type が存在する主な理由です。ユニオン型のエイリアスは選択肢を並べ、タプルのエイリアスは配列の長さと要素の型を固定し、関数のエイリアスはシグネチャを表します。

scale の引数には型注釈が要りません。Transform エイリアスが型を与えています。タプルの構文は タプル で、ユニオン型の絞り込みはユニオン型のページで説明しています。

ジェネリックな型エイリアス

型パラメーターを使うと、1つのエイリアスがさまざまな型に対応します。関数の引数と同じく、デフォルトを持てます。

Result<number> はデフォルトの E = string を使います。type Nullable<T> = T | null や type Dict<T> = Record<string, T> のような小さなジェネリックエイリアスは、実際のコードでよく使われます。組み込みのユーティリティ型(Partial<T>、Pick<T, K>、ReturnType<F>)も、標準ライブラリで宣言されたジェネリックエイリアスです。

エイリアスは名前であって新しい型ではない

エイリアスは別個の型を作りません。右辺の型の2つ目の名前で、コンパイラーは両者を同一として扱います。string の2つのエイリアスは完全に交換可能です:

これはエラーなしに cancelling u_42 を出力します。エイリアスでは防げないバグです。それでもエイリアスは読む人の助けになります(OrderId と型付けされた引数は string より多くを語ります)が、2つの ID の取り違えをコンパイルエラーにしたいなら、string & { readonly __brand: "OrderId" } のようなブランド型を使いましょう。

再帰的な型エイリアス

エイリアスは自分自身を参照できます。木構造、ネストしたリスト、JSONはこの方法で表します:

Json エイリアスは、JSONで表現できない値を拒否します。{ when: new Date() } や { f: undefined } を Json に代入するとコンパイルエラー(TS2322)です。

値から型を作る: typeof

値がすでにあるなら、型を書き出す代わりにその型に名前を付けられます。typeof 型演算子は変数の型を読み取り、ほかの演算子と組み合わせられます:

const defaults = { retries: 3, verbose: false, level: "info" };

type Options = typeof defaults;
// { retries: number; verbose: boolean; level: string }

type OptionKey = keyof typeof defaults;
// "retries" | "verbose" | "level"

function start(port: number) {
  return { port, startedAt: new Date() };
}
type Server = ReturnType<typeof start>;
// { port: number; startedAt: Date }

値が唯一の情報源のままになります。defaults にプロパティを追加すれば Options もそれに従います。詳しくは typeof を参照してください。

エイリアスの export と import

エイリアスは値と同じように export、import します。import type を使うと型だけをインポートすることが明示され、そのインポートは必ずJavaScriptの出力から取り除かれます:

// shapes.ts
export type Point = { x: number; y: number };
export type Shape = { kind: "circle"; center: Point; radius: number };

// main.ts
import type { Point, Shape } from "./shapes.js";

const p: Point = { x: 1, y: 2 };

よくある質問

TypeScriptの型エイリアスとは何ですか?

型エイリアスは、type キーワードで宣言する型の名前です: type Point = { x: number; y: number }。それ以降は、型が期待される場所ならどこでも Point を使えます。オブジェクトの形、ユニオン型、タプル、関数のシグネチャ、プリミティブ、ジェネリック型など、どんな型にも名前を付けられます。

型エイリアスは新しい型を作りますか?

作りません。エイリアスは既存の型の別名にすぎません。type UserId = string と type OrderId = string があるとき、どちらもただの string なので、OrderId が期待される場所に UserId を渡せます。互いに交換できない型を作るにはブランド型を使います。

型エイリアスは自分自身を参照できますか?

自己参照がオブジェクト型、配列、タプルの中にネストしていれば参照できます。type TreeNode = { value: number; children: TreeNode[] } も、Json[] を含む Json エイリアスも動きます。type Loop = Loop | string のようなむき出しの参照はエラー TS2456 Type alias 'Loop' circularly references itself です。

型エイリアスはジェネリックにできますか?

できます。名前のあとに型パラメーターを書きます: type Box<T> = { value: T } とし、Box<number> として使います。パラメーターにはデフォルト(type Result<T, E = string> = ...)や制約(type Keys<T extends object> = keyof T)も付けられます。

既存のオブジェクトから型を得るには?

typeof 型演算子を使います: const defaults = { retries: 3, verbose: false }; type Options = typeof defaults; で { retries: number; verbose: boolean } が得られます。値が先にある場合、信頼できる情報源を1つに保てます。

Coddy programming languages illustration

Coddyでコードを学ぼう

始める