できない.dev

const assertion

別名: as const / const assertion / constアサーション

TypeScript で式に `as const` を付け、リテラルを `string` 等へ広げずリテラル型のまま固定する構文。オブジェクトは readonly、配列は readonly タプルになる。

#typescript#as-const#const-assertion#readonly#literal-type

公開:

定義

const assertionas const)は、式に付けて「これ以上型を広げない」と TypeScript に指示する構文。
リテラルを stringnumber へ広げず、"GET"42 といったリテラル型のまま固定する。
対象がオブジェクトなら全プロパティが readonly、配列なら readonly タプルとして扱われる。

詳細

通常 const obj = { method: "GET" }methodstring 型へ広がる。as const を付けると "GET" リテラル型に固定され、判別可能ユニオンのタグや設定値、ルート定義などで安全に使える。
適用できるのはリテラル式に直接だけで、変数や関数呼び出しの結果には付けられない。

よくある誤解

  • 型アサーション as Foo と同じ: 違う。as Foo は型を別の型へ上書きするが、as const は推論を「狭いまま」固定するだけ。
  • 実行時に値が凍結される: ならない。
    あくまでコンパイル時の型の話で、Object.freeze のような実行時の不変化は行わない。

関連

絞り込みが効かないときは as const をつけても型が絞り込まれない、検査と推論の両立は satisfies 演算子 を参照。