本文へスキップ
BecomeCoder

TypeScriptコース · 第6章 型を変形する · レッスン19

keyof・typeof・インデックスアクセス型

ブラウザで完結

導入

すでにある interface変数から、そのプロパティ名や特定プロパティの型だけを取り出したいことがあります。もう一度同じ内容を書き直さずに済むよう、TypeScript には型から型を取り出す仕組みがあります。

説明

keyof T は「T のプロパティ名をユニオン型にしたもの」です。

interface User {
  id: number;
  name: string;
}

type UserKey = keyof User;   // "id" | "name"
let key: UserKey = "name";
console.log(key);

typeof は変数から型を取り出します(JavaScript の実行時の typeof とは別物で、TypeScript の型の世界だけで使う書き方です)。

const config = { host: "localhost", port: 8080 };
type Config = typeof config;   // { host: string; port: number }

let c: Config = { host: "example.com", port: 443 };
console.log(c.host, c.port);

インデックスアクセス型T["プロパティ名"] の形で、特定のプロパティの型だけを取り出します。

interface User {
  id: number;
  name: string;
}

type NameType = User["name"];   // string
let n: NameType = "太郎";
console.log(n);

やってみよう

UserKey"age" のような、User に存在しないプロパティ名を入れようとするとどうなるか、コードを見ながら考えてみましょう。

演習

interface Item { title: string; price: number; } から keyof を使って ItemKey という型を作ってください。ItemKey 型の変数 k"price" を入れて console.log(k) で表示してください。

ヒント1を見る

type ItemKey = keyof Item; と書きます。

ヒント2を見る

let k: ItemKey = "price"; console.log(k);

実際に動かしてみよう

下のエディタにTypeScriptを書いて「実行」を押すと、その場でJavaScriptに変換してブラウザ内で実行し、出力が表示されます。本文の例をそのまま試したり、型注釈を書き換えたりしてみましょう(console.log の結果が下に出ます。初回だけコンパイラの読み込みに少し時間がかかります)。

TypeScript — ブラウザ内で実行

TypeScriptコンパイラ(同梱)でTS→JSに変換してから実行する学習用環境を読み込みます(初回のみコンパイラの読み込みに少し時間がかかります)。
スクロールして表示された時点でも自動で読み込まれます。