generated at
TypeScript: const assertion (as const)
TypeScriptの const assertion 機能
オブジェクトリテラルの末尾に as const を記述することで、オブジェクトのプロパティ全て readonly で指定した扱いになる
widening を抑止する
ts
const testObj = { name: "aaa", age: 25 } testObj.name = "hello" # これはコンパイルエラーになる

readonly 機能と as const 機能の違い
readonly は プロパティごとにつけられる
一部だけreadonly にしたい場合はこっちを使う
as const は 再帰的に readonly になる
オブジェクトの中にオブジェクトがある場合、readonly を使うと再帰的には指定できない
as const を使うと再帰的に適用される

配列の値からunion型を生成するときに as const を使う
ts
const array = ["a", "b", "c"] as const // "a" | "b" | "c" type Values = typeof array[number]

widening の抑止について
widening とは、型推論を拡大して行うこと
ts
const age = 18
このとき、age は 18 というリテラル型になるのだが、
ts
const myObject = { age: 18, name: "鈴木", }; // 推論結果 // { // age: number, // name: string //}
このときは、推論結果が number と拡大される。
オブジェクトや配列、let の時は widening が行われる
as const を使うと、widening が抑止されて、リテラル型となる
ts
export const myObject = { age: 18, name: "鈴木", } as const;
-> age は 18 のリテラル型、name は 鈴木 のリテラル型