メインコンテンツにスキップ
モジュール 5 · レッスン 2 / 2コース内の 10/14~15 min
モジュールのレッスン (2/2)

リテラルの型とアサーション

TypeScript は、変数の可能な値を絞り込み、必要に応じてコンパイラにより具体的な型を強制的に認識させるための高度なツールを提供します。

リテラル型

リテラル型は、正確な単一の値 (特定の文字列や数値など) を表します。これらは通常、共用体型と組み合わせられます。

TS
type TrafficLight = 'red' | 'yellow' | 'green';
let light: TrafficLight;

light = 'red'; // OK
light = 'blue'; // Error: "blue" is not assignable to TrafficLight

型アサーション (as)

TypeScript がコンパイル時に認識できない型に関する情報がある場合があります。このような場合、as キーワードを使用して type アサーション を使用できます。

TS
const myCanvas = document.getElementById('main_canvas') as HTMLCanvasElement;

アサーションはコンパイラに次のように伝えます: 「信じてください、この要素は HTMLCanvasElement であることはわかっています」。実行時にチェックやキャストは実行されません。型チェッカーのみに役立ちます。

定数アサーション (as const)

const を使用してオブジェクトまたは配列を宣言しても、TypeScript ではその内部プロパティを変更できます。最後に as const を追加すると、構造全体が凍結されて読み取り専用になり、すべてのプロパティが正確なリテラル型に変換されます。

TS
const colors = ['red', 'green', 'blue'] as const;
// colors[0] = "yellow"; // Error: array is read-only

テンプレートのリテラル型

テンプレート リテラル型は JavaScript テンプレート文字列の上に構築されますが、型の位置で使用されます。これらにより、複数のリテラル型を 1 つに組み合わせることができます。

TS
type Size = 'small' | 'large';
type Color = 'red' | 'blue';

// Creates the union: "small-red" | "small-blue" | "large-red" | "large-blue"
type ItemId = `${Size}-${Color}`;

テンプレート リテラル タイプの文字列ユーティリティ

TypeScript は、テンプレート リテラル タイプ内の文字を操作するための特別なユーティリティ タイプを提供します。

  • Capitalize<StringType>: 文字列の最初の文字を大文字にします。
  • Uncapitalize<StringType>: 文字列の最初の文字の大文字を削除します。
  • Uppercase<StringType>: 文字列全体を大文字に変換します。
  • Lowercase<StringType>: 文字列全体を小文字に変換します。
TS
type ActionType = 'click' | 'hover';

// Generates: "onClick" | "onHover"
type EventHandlers = `on${Capitalize<ActionType>}`;

自分で試してみてください

演習 1: 方向リテラル結合

運動#ts.m5.l2.e1
試行回数: 0読み込み中…

文字列「up」、「down」、「left」、「right」のみを受け入れる Direction という名前のリテラル型を定義します。次に、文字列 'Moving ' に続いて受け取った方向を返す move(dir: Direction): string という名前の関数を宣言します。

エディターを読み込み中…
ヒントを表示

最初に | で区切られた 4 つのオプションを使用して型のエイリアスを定義し、次にパラメーターと戻り値の型に注釈を付けた move 関数を宣言します。

3 回の試行後に解決策が利用可能になります

演習 2: JSON.parse のアサーション

運動#ts.m5.l2.e2
試行回数: 0読み込み中…

JSON.parse 関数は、デフォルトで any タイプを返します。 as キーワードを使用して、JSON.parse(json) の結果が type { username: string } としてアサートされるように、parseUser 関数を変更します。

エディターを読み込み中…
ヒントを表示

JSON.parse(json) 呼び出しの直後に「as { username: string }」を追加します。

3 回の試行後に解決策が利用可能になります

演習 3: イベントのテンプレート リテラル

運動#ts.m5.l2.e3
試行回数: 0読み込み中…

ステータス タイプとアクション タイプを指定して、Event という名前のテンプレート文字列タイプを「ステータス-アクション」(「オープン-クリック」など) の形式で定義します。

エディターを読み込み中…
ヒントを表示

バッククォートを使用して型を定義し、内部の ${Status}-${Action} 構文を定義します。

3 回の試行後に解決策が利用可能になります

演習 4: Capitalize を使用したテンプレート リテラル型

運動#ts.m5.l2.e4
試行回数: 0読み込み中…

「クリック」または「ホバー」であるリテラル タイプのイベントを定義します。次に、テンプレート リテラル タイプを使用して、on の後に大文字のイベント名が続く形式の文字列を表す EventHandler タイプを宣言します (つまり、「onClick」または「onHover」)。

エディターを読み込み中…
ヒントを表示

イベントの最初の文字を大文字にするには、テンプレート リテラル内で Capitalize<Event> を使用します。

3 回の試行後に解決策が利用可能になります