型エイリアスは型に名前を付けます。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つに保てます。