TypeScript: const assertion (as const)
オブジェクトリテラルの末尾に as const
を記述することで、オブジェクトのプロパティ全て readonly
で指定した扱いになる
widening を抑止する
tsconst testObj = { name: "aaa", age: 25 }
testObj.name = "hello" # これはコンパイルエラーになる
readonly
機能と as const
機能の違い
readonly は プロパティごとにつけられる
一部だけreadonly にしたい場合はこっちを使う
as const は 再帰的に readonly になる
オブジェクトの中にオブジェクトがある場合、readonly を使うと再帰的には指定できない
as const を使うと再帰的に適用される
配列の値からunion型を生成するときに as const を使う
tsconst array = ["a", "b", "c"] as const
// "a" | "b" | "c"
type Values = typeof array[number]
widening の抑止について
widening とは、型推論を拡大して行うこと
例
このとき、age は 18
というリテラル型になるのだが、
tsconst myObject = {
age: 18,
name: "鈴木",
};
// 推論結果
// {
// age: number,
// name: string
//}
このときは、推論結果が number と拡大される。
オブジェクトや配列、let の時は widening が行われる
as const を使うと、widening が抑止されて、リテラル型となる
tsexport const myObject = {
age: 18,
name: "鈴木",
} as const;
-> age は 18
のリテラル型、name は 鈴木
のリテラル型